字典排序演算法(通俗易懂)

2021-08-16 23:10:50 字數 1541 閱讀 8017

我們先看乙個例子。

示例: 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是列表...