Я действительно однажды написал алгоритм для этого вручную.Вот оно:
bool incr(int z[NUM_INDICES]){
int a=NUM_INDICES-1;
for(int i=NUM_INDICES-2;i>=0;i--)
if(z[i]>z[i+1]) a--;
else break;
if(a==0) return false;
int b=2147483647,c;
for(int i=a;i<=NUM_INDICES-1;i++)
if(z[i]>z[a-1]&&z[i]-z[a-1]<b){
b=z[i]-z[a-1];
c=i;
}
int temp=z[a-1]; z[a-1]=z[c]; z[c]=temp;
qsort(z+a,NUM_INDICES-a,sizeof(int),comp);
return true;
}
Это функция приращения (т. Е. У вас есть массив типа [3,2,4,1], вы передаете его этому, и он изменяет его на [3,4, 1,2]).Он работает на том факте, что если последние d элементы массива расположены в порядке убывания, то следующий массив (в «алфавитном» порядке) должен удовлетворять следующим условиям: 1) последний d+ 1 элементы являются перестановкой между собой;2) элемент d + 1 от последнего к последнему является следующим наивысшим элементом в последних элементах d + 1 ;3) последние элементы d должны быть в порядке возрастания.Вы можете видеть это интуитивно, когда у вас есть что-то вроде [2,5,3, 8,7,6,4,1]: d = 5 в этом случае;3 превращается в следующий наивысший из последних d + 1 = 6 элементов;а последние d = 5 располагаются в порядке возрастания, поэтому становится [2,5,4, 1,3,6,7,8].
Первый цикл в основном определяет* 1 022 * д .Он перебирает массив в обратном порядке, сравнивая последовательные элементы, чтобы определить количество элементов в конце в порядке убывания.В конце цикла a
становится первым элементом в последовательности по убыванию.Если a==0
, то весь массив находится в порядке убывания, и больше ничего нельзя сделать.
Следующий цикл определяет, каким должен быть элемент d + 1 -го-последнего.Мы указали, что это должен быть следующий самый высокий элемент в последних d + 1 элементах, поэтому этот цикл определяет, что это такое.(Обратите внимание, что z [a-1] - это элемент d + 1 от последнего до последнего.) К концу этого цикла b
содержит наименьшее положительное значение z[i]-z[a-1]
;то есть z[i]
должно быть больше, чем z[a-1]
, но как можно ниже (так, чтобы z[a-1]
стал следующим самым высоким элементом).c
содержит индекс соответствующего элемента.Мы отбрасываем b
, потому что нам нужен только индекс.
Следующие три строки меняются местами z[a-1]
и z[c]
, так что элемент d + 1 -последнийполучает следующий элемент в строке, а другой элемент (z[c]
) сохраняет z[a-1]
.Наконец, мы сортируем последние элементы d , используя qsort
(comp
должно быть объявлено в другом месте; см. Документацию C ++ по qsort
).