字典序排序演算法解析
阿新 • • 發佈:2019-01-22
1.1簡述
字典序排序演算法是一種對於隨機序列生成全排列的排序方法。例如對於隨機變數X={1,2,3},則生成的全排列為:{1,2,3}、{1,3,2}、{2,1,3}、{2,3,1}、{3,1,2}、{3,2,1}。
1.2字典序排序的求解步驟:
(1)從右至左找出陣列(序列)中第一個正序(左邊數字小於右邊數字),計左邊數字的下表為left,計當前左邊數字為leftValue
(2)再次從右邊至左邊找出第一個比leftValue大的數,此時該數的下標記為right,交換兩者
(3)將從left+1到陣列的末尾的數按從大到小排序,得到一個排列
(4)重複步驟(1)(2)(3),直到找出所有的排列組合
1.3演算法實現程式碼:
//字典序排序演算法 #include <stdio.h> void SwapValue(int *num1,int *num2) { int tempValue=0; tempValue=*num1; *num1=*num2; *num2=tempValue; } //從右至左找到第一個正序,將左邊數字對應的下標返回 int ReturnIndex(int Array[],int iLength) { int i=0; for(i=iLength-1;i>=0;i--) { if(Array[i-1]<Array[i]) return (i-1); } return -1; } //氣泡排序 void PuppleSort(int Array[],int iLength,int iIndex) { int i=0; int j=0; for(i=1;i<iLength-iIndex;i++) { for(j=iLength-1;j>iIndex+1;j--) { if(Array[j]<Array[j-1]) { SwapValue(&Array[j],&Array[j-1]); } } } } //從右至左找到第一個比指定數字大的數字,找到後交換兩者,找不到返回-1 int GetOnePermutation(int Array[],int iLength,int iIndex) { int i=0; for(i=iLength-1;i>iIndex;i--) { if(Array[i]>Array[iIndex]) { //交換兩者 SwapValue(&Array[i],&Array[iIndex]); //將後續的數字按從小到大順序排序 PuppleSort(Array,iLength,iIndex); return 0; } } return -1; } int main() { int i=0; int list[]={1,2,3,4,5}; int iIndex=0; int iCount=1; for(i=sizeof(list)/sizeof(int);i>0;i--) { iCount*=i; } do { //將得到的一個排列輸出到螢幕上 for(i=0;i<sizeof(list)/sizeof(int);i++) { printf("%d ",list[i]); } printf("\n"); iIndex=ReturnIndex(list,sizeof(list)/sizeof(int)); GetOnePermutation(list,sizeof(list)/sizeof(int),iIndex); iCount--; }while(iCount>0); getchar(); return 0; }