全排列的非递归算法

 1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4
5 #define NumOfElem(a) (sizeof(a)/sizeof(a[0]))
6
7 void Swap(int * a, int m, int n)
8 {
9 int temp = a[m];
10 a[m] = a[n];
11 a[n] = temp;
12 }
13
14 void Input(int *a, int n)
15 {
16 int i = 0;
17 for (i = 0; i < n; ++i) {
18 a[i] = i;
19 }
20 }
21
22 void Output(int *a, int n)
23 {
24 int i = 0;
25 for (i = 0; i < n; ++i) {
26 printf("%4d", a[i]);
27 }
28 printf("\n");
29 }
30
31 int Cmp(const void * data1, const void * data2)
32 {
33 int n1, n2;
34 n1 = *(int *)data1;
35 n2 = *(int *)data2;
36 if (n1 < n2)
37 return -1;
38 if (n1 == n2)
39 return 0;
40 return 1;
41 }
42
43 int mycount = 1;
44
45 bool NextPerm(int * a, int n) // 字典顺序的下一个
46 {
47 int i, j;
48 int flag = false;
49 for (i = n - 1; i >= 0; --i) {
50 for (j = n - 1; j >= i; --j) {
51 if (a[j] > a[i]) {
52 flag = true;
53 Swap(a, i, j);
54 // printf("%d\t%d\n", i, j);
55 break;
56 }
57 }
58 if (flag)
59 break;
60 }
61 if (flag) {
62 qsort(a+i+1, n - i - 1, sizeof(int), Cmp);
63 ++mycount;
64 return true;
65
66 }
67 return false;
68 }
69
70 #define N 5
71 int main()
72 {
73 int a[N];
74 Input(a, N);
75 // int a[N] = {0, 1, 3, 4, 2};
76 Output(a, N);
77 while (NextPerm(a, N)) {
78 Output(a, N);
79 }
80 cout << mycount << endl;
81
82 return 0;
83 }

从后往前找到第一个逆序i, j (pi < pj),这里的第一个是指前面的那个下标i。

此时交换i,j。并给i后面的元素排序,也就是完全升序,即可。

原文地址:https://www.cnblogs.com/tzhangofseu/p/2203063.html