На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Ищется алгоритм перестановки.
    Цитата Cubloid, 14.10.02, 18:09:26

    Demo_S, написанный вами выше вариант, как я понял. Очень похож на приведенный мною выше?

    да, только я делал основной упор на общую идею... а привел какую-то реализацию, первую что пришла в голову.. которая совпадает с твоей идеей.:):)
    наверняка можно ускорить...:)
    тем более посмотри то что предложил тебе Губанов... там тоже длинное не всегда правлипьное осуждение.. но к чему-то оно привело:)
    ЗЫ почему ты думаешь, что этот способо будет медленным? ИМХО все зависит от того, как написать:)
      вот  алгоритм

      для простоты рассмотрим числа 1 2 3 а не -1 0 1 но это не меняет сути

      поясню с помощью примере  пусть есть числа 1 1 1 2 2 3

      пусть начинаем с наименьшего числа и хотим в конце получить наибольшее

      тоесть   111223  первое число и соответственно
                  322111  последнее

      и так как делать переход от одного числа к последующему? достаточно просто. если посмотреть на последнее число с конца то можно увидеть что его цифры дают не убывающию последовательность! ага.

      и так ищем первую цифру с конца которая нарушает неубывающию последовательность

      например для    111322  
      мы видим что это правая единица
      второй этап из всех чисел от правой единицы выбираем то которое меньше всего, в нашем случае 2
      на место 1 пишем два
      получили 112  а оставшиеся числа сортируем и приписываем в возтастающем порядке
      то есть получим
      112123

      и тп.
      по алгоритму получаем
      112132
      112213

      время построение линейно, и меньшего с точки зрения комплексити не добиться ибо надо пройти все числа числа

      с наилучшими
        Вообщем всем спасибки.
        Особенно за последний пост Esperanto.
        В результате на коленках реализовал следущее
        Цитата

        #include <stdio.h>
        #include <string.h>

        int main()
        {
               char str[20];
               strcpy(str,"111223");
               printf ("1\t\%s\n",str);
               int n;
               int k;
               int t;
               int y;
               n=strlen(str)-1;
               int ttt=1;
        while(ttt++)
        {
               k=n-1;
               while ((str[k]>=str[k+1])&&(k>=0)) k--;
               if (k<0) {return(0);}
               t=k+1;
               while ((t<n)&&(str[t+1]>str[k])) t++;
               y=str[k];
               str[k]=str[t];
               str[t]=y;
               printf ("\%d\t\%s\t",ttt,str);
               t=0;
               while (t<(int)((double)(n-k)/2.0))
               {
                       y=str[n-t];
                       str[n-t]=str[k+1+t];
                       str[k+1+t]=y;
                       t++;
               }
               printf ("\%s\n",str);
        }
        }


          Всем огромное спасибо за участие в обсуждении.
          Проблема нашла свое решение.
          Хотя если у кого-то есть более быстрое решение.
          Милости просим, всегда готов рассмотреть.
          Всем еще раз спасибо.
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0183 ]   [ 14 queries used ]   [ Generated: 20.05.24, 22:01 GMT ]