я не могу понять ошибку в моей программе для расчета перестановок - PullRequest
0 голосов
/ 22 августа 2009
#include<stdio.h>
#include<conio.h>
main()
{
int i,j,k,x,y,n=4,a[]={1,2,3,4};   //n is the length of the array
for(i=0;i<n;i++)
{
  for(k=0;k<(n-2);k++)
   {
    for(j=(n-1-k);j>=1;j--)
     {
      y=a[j];
      a[j]=a[j-1];
      a[j-1]=y;
      for(x=0;x<n;x++)
        {
         printf("%d",a[x]);
        }
      printf("\t");
     }
   }
}
getch();
}

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

Некоторый дополнительный материал (я немного пьян, мне, вероятно, придется отредактировать это завтра, поэтому возьмите его с крошкой соли):

Кнут и Седжвик оба покрывали перестановки эоны назад.

Посмотрите на: http://www.princeton.edu/~rblee/ELE572Papers/p137-sedgewick.pdf

Для n предметов у вас есть n! перестановок, так что для 13 предметов у вас уже есть 6 227 020 800 перестановок. Поэтому создание всех перестановок для большого набора предметов станет довольно быстрым.

Существует в основном два набора алгоритмов для создания перестановок: методы ранжирования / отстранения и постепенного изменения.

При ранжировании / отмене рейтинга у вас есть два метода: ранга и отмены.

Ранг даст вам положение перестановки в порядке генерации.

Unrank даст вам перестановку, которая лежит в целом числе m, с 0> = m <= <strong>n! и n количеством элементов, для которых вы хотите создать перестановки.

Это полезно для различных случаев, таких как:

Создание случайной перестановки (вы просто создаете случайное число от 0 до n! И вызываете unrank (randomNumber)) и получаете перестановку в позиции randomNumber.

Создание последовательностей, получение следующей перестановки: у вас есть перестановка p и вызов Rank (p), затем Unrank (rank + 1).

Методы инкрементальных изменений:

Они в основном работают через свопинг и более эффективны, чем ранжирование / отмена рейтинга:

Из википедии, неупорядоченное поколение:

 function permutation(k, s) {
     for j = 2 to length(s) {
        swap s[(k mod j) + 1] with s[j]; // note that our array is indexed starting at 1
        k := k / j;        // integer division cuts off the remainder
     }
     return s;
 }
1 голос
/ 22 августа 2009

Я не знаю смысла вашей программы, но вы можете попытаться прочитать реализацию std :: next_permutation. Генерировать все перестановки с помощью циклов довольно сложно, и я предпочитаю использовать рекурсию.

1 голос
/ 22 августа 2009

Изменить это:

for(k=0;k<(n-2);k++)

к этому:

for(k=0;k<(n-1);k++)

Также попробуйте использовать более описательные имена переменных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...