常用排序演算法總結

2021-09-30 06:36:27 字數 4001 閱讀 3007

一.插入排序

插入排序的基本思想是每步將乙個待排序的記錄按其排序碼值的大小,插到前面已經排好的檔案中的適當位置,直到全部插入完為止。插入排序方法主要有直接插入排序和希爾排序。

①.直接插入排序(穩定)

接插入排序的過程為:在插入第i個記錄時,r1,r2,..ri-1已經排好序,將第i個記錄的排序碼ki依次和r1,r2,..,ri-1的排序碼逐個進行比較,找到適當的位置。使用直接插入排序,對於具有n個記錄的檔案,要進行n-1趟排序。

**如下:

②.希爾排序(不穩定):

希爾(shell)排序的基本思想是:先取乙個小於n的整數d1作為第乙個增量把檔案的全部記錄分成d1個組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取得第二個增量d2

二.選擇排序

選擇排序的基本思想是每步從待排序的記錄中選出排序碼最小的記錄,順序存放在已排序的記錄序列的後面,直到全部排完。選擇排序中主要使用直接選擇排序和堆排序。

①.直接選擇排序(不穩定)

直接選擇排序的過程是:首先在所有記錄中選出序碼最小的記錄,把它與第1個記錄交換,然後在其餘的記錄內選出排序碼最小的記錄,與第2個記錄交換......依次類推,直到所有記錄排完為止。

無**件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需要做n-i次比較,因此,總的比較次數為n(n-1)/2=o(n^2)。當初始檔案為正序時,移動次數為0;檔案初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。直接選擇排序的平均時間複雜度為o(n^2)。直接選擇排序是不穩定的。

**如下:

②.堆排序(不穩定)

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。n個關鍵字序列

k1,k2,...,kn稱為堆,當且僅當該序列滿足(ki<=k2i且ki<=k2i+1)或(ki>=k2i且ki>=k2i+1),(1<=i<=n/2)。根結點(堆頂)的關鍵字是堆裡所有結點關鍵字中最小者,稱為小根堆;根結點的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆。

若將此序列所儲存的向量r[1..n]看作是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

堆排序的關鍵步驟有兩個:一是如何建立初始堆;二是當堆的根結點與堆的最後乙個結點交換後,如何對少了乙個結點後的結點序列做調整,使之重新成為堆。堆排序的最壞時間複雜度為o(nlog2n),堆排序的平均效能較接近於最壞效能。由於建初始堆所需的比較 次數較多,所以堆排序不適宜於記錄較少的檔案。堆排序是就地排序,輔助空間為o(1),它是不穩定的排序方法。

**略..

三.交換排序

交換排序的基本思想是:兩兩比較待排序記錄的排序碼,並交換不滿足順序要求的那寫偶對,直到滿足條件為止。交換排序的主要方法有氣泡排序和快速排序.

①.氣泡排序(穩定的)

氣泡排序將被排序的記錄陣列r[1..n]垂直排列,每個記錄r[i]看作是重量為ki的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r;凡掃瞄到違反本原則的輕氣泡,就使其向上"漂浮"。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

氣泡排序的具體過程如下:

第一步,先比較k1和k2,若k1>k2,則交換k1和k2所在的記錄,否則不交換。繼續對k2和k3重複上述過程,直到處理完kn-1和kn。這時最大的排序碼記錄轉到了最後位置,稱第1次起泡,共執行n-1次比較。

與第一步類似,從k1和k2開始比較,到kn-2和kn-1為止,共執行n-2次比較。

依次類推,共做n-1次起泡,完成整個排序過程。

若檔案的初始狀態是正序的,一趟掃瞄即可完成排序。所需關鍵字比較次數為n-1次,記錄移動次數為0。因此,氣泡排序最好的時間複雜度為o(n)。

若初始檔案是反序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1<=i<=n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較次數達到最大值n(n-1)/2=o(n^2),移動次數也達到最大值3n(n-1)/2=o(n^2)。因此,氣泡排序的最壞時間複雜度為o(n^2)。

雖然氣泡排序不一定要進行n-1趟,但由於它的記錄移動次數較多,故平均效能比直接插入排序要差得多。氣泡排序是就地排序,且它是穩定的。

**如下:

②.快速排序:(不穩定的)

快速排序採用了一種分治的策略,通常稱其為分治法,其基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

快速排序的具體過程如下:

第一步,在待排序的n個記錄中任取乙個記錄,以該記錄的排序碼為準,將所有記錄分成兩組,第1組各記錄的排序碼都小於等於該排序碼,第2組各記錄的排序碼都大於該排序碼,並把該記錄排在這兩組中間。

第二步,採用同樣的方法,對左邊的組和右邊的組進行排序,直到所有記錄都排到相應的位置為止。

**如下:

四.歸併排序

歸併排序是將兩個或兩個以上的有序子表合併成乙個新的有序表。初始時,把含有n個結點的待排序序列看作由n個長度都為1的有序子表組成,將它們依次兩兩歸併得到長度為2的若干有序子表,再對它們兩兩合併。直到得到長度為n的有序表,排序結束。

歸併排序是一種穩定的排序,可用順序儲存結構,也易於在鍊錶上實現,對長度為n的檔案,需進行log2n趟二路歸併,每趟歸併的時間為o(n),故其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlog2n)。歸併排序需要乙個輔助向量來暫存兩個有序子檔案歸併的結果,故其輔助空間複雜度為o(n),顯然它不是就地排序。

**略...

五.基數排序

設單關鍵字的每個分量的取值範圍均是c0<=kj<=crd-1(0<=j<=rd),可能的取值個數rd稱為基數.基數的選擇和關鍵字的分解因關鍵字的型別而異.

(1).若關鍵字是十進位制整數,則按個、十等位進行分解,基數rd=10,c0=0,c9=9,d為最長整數的位數.

(2).若關鍵字是小寫的英文本串,則rd=26,c0='a',c25='z',d為最長字串的長度.

基數排序的基本思想是:從低位到高位依次對待排序的關鍵碼進行分配和收集,經過d趟分配和收集,就可以得到乙個有序序列.

按平均時間將排序分為四類:

(1)平方階(o(n2))排序

一般稱為簡單排序,例如直接插入、直接選擇和氣泡排序;

(2)線性對數階(o(nlgn))排序

如快速、堆和歸併排序;

(3)o(n1+£)階排序

£是介於0和1之間的常數,即0<£<1,如希爾排序;

(4)線性階(o(n))排序

如基數排序。

各種排序方法比較

簡單排序中直接插入最好,快速排序最快,當檔案為正序時,直接插入和冒泡均最佳。

影響排序效果的因素

因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法應綜合考慮下列因素:

①待排序的記錄數目n;

②記錄的大小(規模);

③關鍵字的結構及其初始狀態;

④對穩定性的要求;

⑤語言工具的條件;

⑥儲存結構;

⑦時間和輔助空間複雜度等。

不同條件下,排序方法的選擇

(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。

當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。

(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;

(3)若n較大,則應採用時間複雜度為o(nlgn)的排序方法:快速排序、堆排序或

歸併排序。

快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;

堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。

若要求排序穩定,則可選用歸併排序。但從單個記錄起進行兩兩歸併的  排序演算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子檔案,然後再兩兩歸併之。因為直接插入排序是穩定的,所以改進後的歸併排序仍是穩定的。

常用排序演算法總結

總結些常見的排序演算法,方便以後可以重用。資料量不大,為了表達方便就直接使用了陣列。int data null data new int 1.氣泡排序 氣泡排序,從小到大排序 for int i 0 i data.length i 氣泡排序就是說,排序的過程像水裡往上冒的氣泡一樣,每個數字代表乙個氣...

常用排序演算法總結

常用排序演算法總結 選擇排序 對於長度為n的陣列,選擇排序需要大約n2 2詞比較和n次交換。插入排序 對於隨機排列的長度為n且主鍵不重複的陣列 1 平均情況下,需要 n2 4次比較以及 n2 4次交換。2 最壞情況下,需要 n2 2次比較以及 n2 2次交換 3 最好情況下,需要n 1次比較以及0次...

常用排序演算法總結

注 所有排序都是寫的由小到大排序的情況 1.插入排序 1 直接插入排序 穩定 arr sortedindex 1 key 注意這裡的下標 sortedindex 1 2 希爾排序 不穩定 希爾排序好的增量序列的共同特徵 希爾排序演算法 fromid 1801475 type syn 最後乙個增量必須...