全排列


原創


全排列算法是非常基礎的算法,寫此篇博客,旨在鞏固自己的知識,理清自己的思路,有錯誤的地方歡迎大家指出。

還是辣個栗子:

數列 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM