字典序全排列

xiaoxiao2021-02-28  115

C语言名题百则的字典序排列程序好有点问题,改了一下代码如下:

#include <stdio.h> #include <stdlib.h> #include<iostream> #define MAXSIZE 20 void swap(int &a, int &b) { int tmp; tmp = a; a = b; b = tmp; } void reverse(int L, int R, int perm[]) { for (int i = L, j = R; i < j; i++, j--) { swap(perm[i], perm[j]); } } void display(int perm[], int R) { for (int i = 0; i <= R; i++) { std::cout << perm[i] << std::ends; } std::cout << std::endl; } void again(int perm[], int L, int R)//排列L到R并从首项 打印 { int i = R; if (L == R) { display(perm, R); return; } while (1) { again(perm, L + 1, R); if (i > L) { swap(perm[L], perm[i]); reverse(L + 1, R,perm); display(perm, R); i--; } else break; } } void permut(int perm[], int n) { int i; for (i = 0; i <= n; i++) perm[i] = i + 1; again(perm, 0, n); } void main(void) { int perm[MAXSIZE]; char line[100]; int n; gets(line); n = atoi(line); permut(perm, n - 1); system("pause"); }

另外还参考了另外一个大神的代码,思路就是先确定排列个数,然后每次从排列从右往左找出第一个逆序数,再将其与右边最小的数交换,然后将右边数反转。

#include <stdio.h> #include<algorithm> 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"); 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 = 0; k<n; k++) //n次循环 { Output(); //输出 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]的数 } } 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("=", a[i]); } printf("\n"); }

转载请注明原文地址: https://www.6miu.com/read-59412.html

最新回复(0)