原創
全排列算法是非常基礎的算法,寫此篇博客,旨在鞏固自己的知識,理清自己的思路,有錯誤的地方歡迎大家指出。
還是辣個栗子:
數列 1 2 3 的全排列為:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
排列數的計算公式為:n!
就像是給了n個空格,拿n個數填充,第1個空格有n種填充方法,第2個空格有n-1種填充方法......
看下圖:
1 2 3 4 5 的全排列,第1個空格有5種填充方法,相當於第一個數和后面的5-1個數分別做了一次交換。
那么第一個空格的所有情況已經求出來了,同理,在第1個空格的基礎上,第2個空格有n-1種填充方法,相當於第2個數和后面的5-2個數分別做了一次交換。
所以我們可以先把以1開頭的全排列情況全部求出來,再求以2、3、4、5的,在以1開頭的前提下,我們再以2開頭,層層遞歸下去,值得注意的是,交換以后我們需要再交換回來;
不難理解為何交換回來,如果我們把1和3交換了,不交換回來的話,下一次交換就是3,4交換了,而我們是需要下一次交換1和4的。
1 #include<stdio.h>
2
3 int arr[]={1,2,3,4,5}; 4
5 void swap(int a,int b) //a,b表示數組下標
6 { 7 int temp; 8 temp=arr[a]; 9 arr[a]=arr[b]; 10 arr[b]=temp; 11 } 12
13 void Fullsort(int n) 14 { 15 if(n==5) //輸出
16 { 17 int i; 18 for(i=0;i<=4;i++) 19 printf("%d ",arr[i]); 20 printf("\n"); 21 return; 22 } 23
24 int i; 25 for(i=n;i<=4;i++) //第n個位置的數分別與后面4-n個位置的數(包含本身)交換
26 { 27 swap(n,i); 28 Fullsort(n+1); 29 swap(n,i); //換回來
30 } 31 } 32
33 int main() 34 { 35 Fullsort(0); 36 return 0; 37 }
12:03:33
2018-04-06