递归的写法很好写,但是输出的并不是从小到大的排列。
非递归的算法 就是按照字典序排列
思路:
1.对初始队列进行排序,找到所有排列中最小的一个排列Pmin。
2.找到刚刚好比Pmin大比其它都小的排列P(min+1)。
3.循环执行第二步,直到找到一个最大的排列,算法结束。
如 a[5] = {1,2,3,4,5};
这正好是字典序中最小的。
从此处开始
从后向前 找到第一个 a[i] < a[i+1] 的 位置i;
从后向前找到第一个比a[i] 大 的位置 j;
交换a[i],a[j];
逆置 a[i+1],,,a[len-1];
重复上面的步骤就好了。
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void swap(int *a,int i,int j){
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
void reverse(int a[],int i,int j){
for(; i < j; ++i,--j){
swap(a,i,j);
}
}
void print(int a[],int length){
int i;
for(i = 0; i < length; ++i)
printf("%d",a[i]);
printf("\n");
}
void combination(int a[],int length){
if(length < 2) return;
while(1){
print(a,length);
int i,j;
for(i = length-2; i >= 0; --i){
if(a[i] < a[i+1]) break;
else if(i == 0) return;
}
for(j = length - 1; j > i; --j){
if(a[j]>a[i]) break;
}
swap(a,i,j);
reverse(a,i+1,length-1);
}
}
int main(){
int a[5] = {1,2,3,4,5};
combination(a,4);
return 0;
}