數據結構與算法(8)-排序

目錄
一.排序的基本概念與分類
    1.定義
    2.排序的穩定性
    3.內排序與外排序
二.冒泡排序
    1.冒泡排序的基本思想
    2.冒泡排序算法
    3.冒泡排序代碼實現
    4.冒泡排序優化
    5.冒泡排序複雜度
三.簡單選擇排序
    1.簡單選擇排序算法
    2.簡單選擇排序複雜度分析
四.直接插入排序
    1.直接插入排序算法
    2.直接插入排序複雜度分析
五.希爾排序
    1.希爾排序原理
    2.希爾排序算法
    3.希爾排序複雜度分析
六.堆排序
    1.定義
    2.堆排序算法
    3.堆排序複雜度分析
七.歸併排序:
    1.歸併排序算法
    2.歸併排序複雜度分析
    3.非遞歸實現歸併排序
八.快速排序
    1.含義
    2.快速排序算法
    3.快速排序複雜度分析
    4.快速排序的優化
九.總結
    1.內排序分類
    2.排序算法複雜度
    3.從算法的簡單性來看,我們將7種算法分爲兩類

一.排序的基本概念與分類

1.定義:

(1)排序:

假設含有n個記錄的序列爲{r1,r2,…,rn},其相應的關鍵字分別爲{k1,k2,…,kn},需確定1,2,…,n的一種排列p1,p2,…,pn,使其相應的關鍵字滿足kp1≤kp2≤…≤kpn(非遞減或非遞增)關係,即使得序列成爲一個按關鍵字有序的序列{rp1,rp2,…,rpn},這樣的操作就稱爲排序

2.排序的穩定性:

(1)假設ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri領先於rj(即i<j)。如果排序後ri仍領先於rj,則稱所用的排序方法是穩定的;反之,若可能使得排序後的序列中rj領先ri,則稱所用的排序方法是不穩定的

3.內排序與外排序

(1)內排序是在排序整個過程中,待排序的所有記錄全部被放置在內存中

(2)外排序是由於排序的記錄個數太多,不能同時放置在內存,整個排序過程需要在內外存之間多次交換數據才能進行

(3)對於內排序來說,排序算法的性能主要是受3個方面影響:

  • 時間性能:高效率的內排序算法應該是具有儘可能少的關鍵字比較次數和儘可能少的記錄移動次數
  • 輔助空間:評價排序算法的另一個主要標準是執行算法所需要的輔助存儲空間。輔助存儲空間是除了存放待排序所佔用的存儲空間之外,執行算法所需要的其他存儲空間
  • 算法的複雜性:這裏指的是算法本身的複雜度,而不是指算法的時間複雜度

(4)內排序分爲:插入排序、交換排序、選擇排序和歸併排序

排序

二.冒泡排序

1.冒泡排序的基本思想:

冒泡排序(Bubble Sort)一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄爲止

2.冒泡排序算法:

冒泡排序圖解1

冒泡排序圖解2

3.冒泡排序代碼實現:

4.冒泡排序優化

5.冒泡排序複雜度:

冒泡排序的時間複雜度爲O(n2)。

三.簡單選擇排序

1.簡單選擇排序算法:

(1)定義:

簡單選擇排序法(Simple Selection Sort)就是通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1≤i≤n)個記錄交換之

(2)代碼實現:

2.簡單選擇排序複雜度分析:

(1)簡單選擇排序的“時間複雜度依然爲O(n2)

(2)儘管與冒泡排序同爲O(n2),但簡單選擇排序的性能上還是要略優於冒泡排序

四.直接插入排序

1.直接插入排序算法:

(1)定義:

直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表

(2)代碼實現:

2.直接插入排序複雜度分析

(1)直接插入排序法的時間複雜度爲O(n2)

(2)同樣的O(n2)時間複雜度,直接插入排序法比冒泡和簡單選擇排序的性能要好一些

五.希爾排序

1.希爾排序原理:

2.希爾排序算法:

3.希爾排序複雜度分析:

六.堆排序:

1.定義:

(1)堆排序(HeapSort),就是對簡單選擇排序進行的一種改進
(2)堆是具有下列性質的完全二叉樹:
  • 每個結點的值都大於或等於其左右孩子結點的值,稱爲大頂堆(如圖所示);
  • 或者每個結點的值都小於或等於其左右孩子結點的值,稱爲小頂堆

堆

2.堆排序算法:

(1)堆排序(Heap Sort)就是利用堆(假設利用大頂堆)進行排序的方法
(2)基本思想:

將待排序的序列構造成一個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走(其實就是將其與堆數組的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構造成一個堆,這樣就會得到n個元素中的次大值。如此反覆執行,便能得到一個有序序列了

(3)代碼實現:

3.堆排序複雜度分析:

(1)堆排序的時間複雜度爲O(nlogn)

七.歸併排序:

1.歸併排序算法:

(1)歸併排序(Merging Sort)就是利用歸併的思想實現的排序方法
(2)原理:

它的原理是假設初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度爲1,然後兩兩歸併,得到|n/2|(|x|表示不小於x的最小整數)個長度爲2或1的有序子序列;再兩兩歸併,……,如此重複,直至得到一個長度爲n的有序序列爲止,這種排序方法稱爲2路歸併排序

(3)代碼實現:

2.歸併排序複雜度分析:

(1)歸併排序的算法複雜度爲O(nlogn)
3.非遞歸實現歸併排序:
(1)代碼實現:
(2)使用歸併排序時,儘量考慮用非遞歸方法

八.快速排序:

1.含義:

(1)希爾排序相當於直接插入排序的升級,它們同屬於插入排序類
(2)堆排序相當於簡單選擇排序的升級,它們同屬於選擇排序類。
(3)而快速排序其實就是冒泡排序的升級,它們都屬於交換排序類

2.快速排序算法:

(1)基本思想:

通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的

(2)代碼實現:

3.快速排序複雜度分析:

(1)快速排序的算法複雜度爲O(nlogn)

4.快速排序的優化

(1)優化選取樞軸
(2)優化不必要的交換
(3)優化小數組時的排序方案
(4)優化遞歸操作:

九.總結:

1.將內排序分爲:插入排序、交換排序、選擇排序和歸併排序四類

排序分類

2.排序算法複雜度:

排序複雜度

3.從算法的簡單性來看,我們將7種算法分爲兩類:

  • 簡單算法:冒泡、簡單選擇、直接插入
  • 改進算法:希爾、堆、歸併、快速

(1)從平均情況來看,顯然最後3種改進算法要勝過希爾排序,並遠遠勝過前3種簡單算法。

(2)從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果你的待排序序列總是基本有序,反而不應該考慮4種複雜的改進算法。

(3)從最壞情況看,堆排序與歸併排序又強過快速排序以及其他簡單排序

(4)從穩定性來看,歸併排序獨佔鰲頭,對於非常在乎排序穩定性的應用中,歸併排序是個好算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章