1. 程式人生 > >浙大公開課-資料結構-排序-筆記整理

浙大公開課-資料結構-排序-筆記整理

去年我在網易公開課參加了浙大公開課-<資料結構>的學習.講師是陳越姥姥和何欽銘先生.
今天我再次將之前的筆記做了整理.希望方便盆友們的學習.

排序演算法是否穩定?

兩個相同資料的先後順序能否保證在排序後不變.

內排序和外排序

我們知道,按照待排序資料能否在你的記憶體中放得下,分為內排序外排序.

1氣泡排序的效率:

最快0(n)
最壞O(n^2)

優點:

  1. 簡單
  2. 適合連結串列操作(只比較和修改相鄰的資料)
  3. 穩定.

2插入排序的效率:

最快0(n)
最壞O(n^2)

優點:

  1. 簡單
  2. 操作較少.每次比較最多移動一個數據.(相較於氣泡排序)
  3. 序列基本有序,則插入排序簡單高效.
  4. 穩定.

逆序對:
對於下標i>j,如果A[i]>A[j],則稱(i,j)是一對逆序對(inversion).

插入排序:T(N,I)=O(N+I);(I為逆序對)
N(N-1)/4個逆序對.

交換比較相鄰的資料,每次對多消去一個逆序對.所以……

3希爾排序Sheel

插入的簡便+克服插入每次只能消除一個逆序對.

定義增量序列:
原始序列是:n/2,n/4,……1;
但是這樣的序列增量元素不互質,小增量就可能根本不起作用.

兩種增量序列:

Hibbard增量序列:
Dk=2^k-1 (相鄰互質)

Sedgewick增量序列:
9*4^i-9*2i+1
或者
4^i-3*2^i+1

這兩種增量序列Sedgewick最壞情況和平均時間複雜度都要好一些.

4堆排序

回顧選擇排序:
找到最小元,將該元放到隊尾.重複這個過程.
O(n)
T(n^2)
選擇排序,

改進選擇排序的時間效率集中在了:快速找到最小元.

使用最小堆:
堆排序是對選擇排序尋找最小元的改進.
時間複雜度:時間複雜度(nlogn)
但是最小堆排序後果是:需要一倍的記憶體.

進一步的改進是使用最大堆.
對於隨機排列的N個不同元素
時間複雜度O(2NlogN-O(Nlog logN))

但是實際效果不如用Sedgewick增量序列的希爾排序.
其虛擬碼如下:
堆排序

什麼時候適合選擇排序(堆排序)?

排序操作不需要完全執行時,選擇排序較為適合。
舉個栗子:要得到最大的前K個的數。

3 歸併排序-外排序時非常有用

核心:有序子咧的歸併
T(N)=O(N)

遞迴演算法:
分而治之
T(N)=T(N/2)+T(N/2)+O(N) => T(N)=O(NlogN)
穩定

非遞迴演算法:
NLogN
穩定

4 快速排序

分而治之

N<2退出
1分:隨機挑選主元.劃分兩個子集.
2治:兩邊遞迴

主元挑選方法
劃分兩個子集的方法

最好情況:
主元每次最好中分.
T(N)=O(NlogN)

主元的挑選方法:
頭中尾取中位數.或者多個位置取中位數.

對於小規模資料(例如N<100)可能還不如插入排序快.
所以一種策略是:
當遞迴的資料規模充分小時,停止遞迴,直接呼叫簡單排序.
這個閥值(Cutoff).

快速排序程式碼實現:
快速排序

還有常用排序演算法效率和場景的總結和表排序以及基數排序的內容視情況總結.