我們先看乙個例子。
示例: 1 2 3的全排列如下:
1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1
我們這裡是通過字典序法找出來的。
那麼什麼是字典序法呢?
從上面的全排列也可以看出來了,從左往右依次增大,對這就是字典序法。可是如何用演算法來實現字典序法全排列呢?
你主要看紅色字型部分就行了,這就是步驟。
如果當前排列是124653,找它的下乙個排列的方法是,從這個序列中從右至左找第乙個左鄰小於右鄰的數,
如果找不到,則所有排列求解完成,如果找得到則說明排列未完成。
本例中將找到46,計4所在的位置為i,找到後不能直接將46位置互換,而又要從右到左到第乙個比4大的數,
本例找到的數是5,其位置計為j,將i與j所在元素交換125643,
然後將i+1至最後乙個元素從小到大排序得到125346,這就是124653的下乙個排列。
下圖是用字典序法找1 2 3的全排列(全過程):
總結得出字典排序演算法四步法:
字典排序:
第一步:從右至左找第乙個左鄰小於右鄰的數,記下位置i,值list[a]
第二部:從右邊往左找第乙個右邊大於list[a]的第乙個值,記下位置j,值list[b]
第三步:交換list[a]和list[b]的值
第四步:將i以後的元素重新按從小到大的順序排列
舉例:125643的下乙個字典序列
第一步:右邊值大於左邊的3<4,4<6,6>5,則i=2,list[a]=5
第二步:從右往左找出第乙個右邊大於list[a]=5的值,找到6>5,j=3;list[b]=6;
第三步:交換list[a]和list[b]的值,序列125643->126543
第四步:將位置2以後的元素重新排序,126543->126345;
結束: 126345即125643的下乙個序列
**實現(c語言):
#include #define swap(a,b) //交換a,b值
void sort(int arr,int start,int end)//氣泡排序,從start到end的排序,使用時注意是陣列的下標,如陣列下標0-3排序,sort(arr,0,3) }}
void permutation(int arr,int n) //字典排序
sort(arr,0,n-1);//先對陣列進行一次按從小到大排列排序
for(k=num;k>0;k--) //進行num次迴圈
}swap(arr[a],arr[b]); //這是第三步
sort(arr,a+1,n-1); //這是第四步 }}
int main()
; permutation(arr,4);
return 0;
}
執行結果(dev-c):
引用部落格:
氣泡排序 通俗易懂
氣泡排序是一種簡單的排序演算法,它也是一種穩定排序演算法。其實現原理是重複走訪過要排序的元素列,依次比較兩個相鄰的元素,如果當該對元素順序不正確時進行交換過來。一直重複這個過程,直到沒有任何兩個相鄰元素可以交換,就表明完成了排序。注意 一般情況下,稱某個排序演算法穩定 指的是當待排序序列中有相同的元...
通俗易懂的EM演算法
假設現在有兩枚硬幣1和2,隨機拋擲後正面朝上概率分別為p1,p2。為了估計這兩個概率,做實驗,每次取一枚硬幣,連擲5下,記錄下結果,如下 硬幣結果統計1 正正反正反 3正 2反 2反反正正反 2正 3反 1正反反反反 1正 4反 2正反反正正 3正 2反 1反正正反反 2正 3反 可以很容易地估計出...
numpy bincount 通俗易懂
bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...