1. 程式人生 > >大話數據結構9之排序

大話數據結構9之排序

不必要 wid 左右 必須 selection bsp 棧空間 元素交換 占用

1.使得序列成為一個按關鍵字有序的序列,這樣的操作稱為排序。

2.排序的穩定性:穩定和非穩定的

3.內排序與外排序:

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

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

  內排序:性能受3個方面影響 時間性能 輔助空間 算法的復雜性

  根據排序過程中借助的主要槽組內排序分為:插入排序 交換排序 選擇排序 歸並排序

按照算法的復雜度分為兩大類:冒泡排序 簡單選擇排序 直接插入排序 屬於簡單排序。 希爾排序 堆排序 歸並排序 快速排序 屬於改進算法

4.冒泡排序

  冒泡排序(Bubble sort)一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,入如果反序則交換,直到沒有反序的記錄為止。時間復雜度為O(n2).

5.簡單選擇排序

  簡單選擇排序(simple selection sort)就是通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1≤i≤n)個記錄交換之。時間復雜度為O(n2).性能略優於冒泡排序。

6.直接插入排序

  直接插入排序(Straight Insertion Sort )的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。時間復雜度為O(n2)。性能比冒泡和簡單選擇排序好點。

7.希爾排序

  基本有序,就是小的關鍵字基本在前面,大的基本在前面,不大不小的基本在中間。

  跳躍分割:將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序後得到的結果是基本有序而不是局部有序。增量序列的最後一個增量值必須等於1才行。

  希爾排序的關鍵不是隨便分組後各自排序,而是將相隔某個增量的記錄組成一個子序列,實現跳躍式的移動,使得排序的效率提高。時間復雜的為O(n3/2)。直接插入排序的升級

8.堆排序

  堆排序(heap sort)就是對簡單選擇排序進行的一種改進。

  堆是具有下列性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。

  堆排序算法:堆排序(heap sort)就是利用堆(假設利用大頂堆)進行排序的方法。它的基本思想是,將待排序的序列構造成一個大頂堆。此時,整個序列的最大值就是堆頂堆根結點。把它移走(其實就是將其與堆數組的末尾元素交換,此時末尾元素就是最大值),然後將剩余的n-1個序列重新構造成一個堆,這樣就會得到n個元素中次小值。如此反復執行,便能得到一個有序序列了。

  時間復雜度為O(nlogn)

9.歸並排序  

  歸並排序(merging sort)就是利用歸並的思想實現的排序方法。它的原理是假設初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸並,得到[n/2]([x]表示不小於小x的最小整數)個長度為2或1的有序子序列;再兩兩歸並,。。。,如此重復,直到得到一個長度為n的有序序列為止,這種排序方法稱為2路歸並排序。

  時間復雜度為O(nlogn)

  空間復雜度O(n+logn)

  遞歸歸並排序是一種比較占用內存,但卻效率很高且穩定的算法。

  非遞歸的叠代方法避免了遞歸時深度為log2n的棧空間,空間復雜度為O(n),使用歸並排序時盡量考慮用非遞歸方法。

10.快速排序(很強)

  快速排序(quick sort)的基本思想是:通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。

  最優情況下,時間復雜度為O(nlogn)  

  快速排序優化

    優化選取樞軸

    優化不必要的變換

    優化小數組時的排序方案

    優化遞歸操作

                        排序

    插入排序類            選擇排序類               交換排序類          歸並排序類

直接插入排序  希爾排序        簡單選擇排序 堆排序        冒泡排序 快速排序          歸並排序

排序方法   平均情況 最好情況 最壞情況 輔助空間 穩定性
冒泡排序 O(n2 O(n) O(n2 O(1) 穩定
簡單選擇排序 O(n2 O(n2 O(n2 O(1) 穩定
直接插入排序 O(n2 O(n) O(n2 O(1) 穩定
希爾排序 O(nlogn)~O(n2 O(n1.3 O(n2 O(1) 不穩定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不穩定
歸並排序 O(nlogn) O(nlogn) O(nlogn) O(n) 穩定
快速排序 O(nlogn) O(nlogn) O(n2 O(nlogn)~O(n) 不穩定

從綜合各項指標來說,經過優化的快速排序是性能最好的排序算法。

    

大話數據結構9之排序