全排列算法实现

7年前一个组合算法错失鹅场offer,之后专门了解排列组合的算法,岂知入了社会,大部分算法根本就用不到。闲着无事,回忆排列算法如何实现的。

算法最重要的一步-证明,貌似一般学校都不教的吧。用数学归纳可以简单认为是对的。

 1 int getValidLen(int a[], int max)
 2 {
 3     return 6;
 4 }
 5 
 6 void printArray(int a[], int len, int times)
 7 {
 8     printf("%04d: ", times);
 9     for (int i = 1; i <= len; i++)
10     {
11         printf("%d ", a[i]);
12     }
13     printf("\n");
14 }
15 
16 void reverseSort(int a[], int len, int position)
17 {
18     int middle = (len + position) / 2;
19     int end = len;
20     int tmp = 0;
21     for (int i = position; i <= middle; i++)
22     {
23         tmp = a[i];
24         a[i] = a[end];
25         a[end] = tmp;
26         end -= 1;
27     }
28 }
29 int main()
30 {
31     int a[30] = { 0 };
32     int len = getValidLen(a, 29);
33     int times = 0;
34     for (int i = 1; i <= len; i++)
35     {
36         a[i] = i;
37     }
38     int loop = 0;
39     int loop1 = 0;
40     while (true)
41     {
42         times++;
43         printArray(a, len, times);
44         for (loop = len; loop > 1; loop--)
45         {
46             if (a[loop] > a[loop - 1])
47                 break;
48         }
49         if (loop == 1)
50         {
51             printf("Over!\n");
52             break;
53         }
54         //insert sort
55         for (loop1 = len; loop1 >= loop; loop1--)
56         {
57             if (a[loop1] > a[loop - 1])
58             {
59                 a[0] = a[loop - 1];
60                 a[loop - 1] = a[loop1];
61                 a[loop1] = a[0];
62                 break;
63             }
64         }
65         //reverse sort
66         reverseSort(a, len, loop);
67     }
68 }
View Code

 

posted @ 2018-05-01 16:21  green_crosswalk  阅读(115)  评论(0编辑  收藏  举报