- #include <stdio.h>
- int a[10],N;
- int cmp(const void *a,const void *b)
- {
- return *(int*)a-*(int*)b;
- }
- int fac();
- void Fun();
- void Reverse(int m,int n);
- void Output();
- int main()
- {
- int i;
- while (printf("\nPlease input N: "),scanf("%d",&N)!=EOF)
- {
- printf("Please input %d numbers:\n",N);
- for (i=0;i<N;i++)
- {
- scanf("%d",&a[i]);
- }
- qsort(a,N,sizeof(a[0]),cmp); //先将N个数排序
- printf("These numbers are: \n");
- for (i=0;i<N;i++)
- {
- printf("%3d",a[i]);
- }
- printf("\n");
- Fun();
- }
- return 0;
- }
- int fac() //求N的阶乘,即全排列的个数
- {
- int count=1,i=2;
- while (i<=N)
- {
- count*=i;
- i++;
- }
- return count;
- }
- void Fun()
- {
- int index1,index2,i,k,min,n,temp; //index1为上述j下标,index2为上述k下标
- n=fac();
- for (k=1;k<n;k++) //n次循环
- {
- for (index1=N-2;index1>=0;index1--) //求index1下标
- {
- if (a[index1]<a[index1+1])
- {
- break;
- }
- }
- min=32767;
- for (i=index1+1;i<N;i++) //求index2
- {
- if (a[i]>a[index1])
- {
- if (a[i]<min)
- {
- min=a[i];
- index2=i;
- }
- }
- }
- temp=a[index1]; //交换a[index1],a[index2]
- a[index1]=a[index2];
- a[index2]=temp;
- Reverse(index1+1,N-1); //逆置a[index1]到a[N-1]的数
- Output(); //输出
- }
- }
- void Reverse(int m,int n)
- {
- int temp;
- while (m<n)
- {
- temp=a[m];
- a[m]=a[n];
- a[n]=temp;
- m++;
- n--;
- }
- }
- void Output()
- {
- int i;
- for (i=0;i<N;i++)
- {
- printf("%3d",a[i]);
- }
- printf("\n");
- }
字典序算法
最新推荐文章于 2022-10-24 20:08:35 发布