浙大公開課-資料結構-排序-筆記整理
去年我在網易公開課參加了浙大公開課-<資料結構>的學習.講師是陳越姥姥和何欽銘先生.
今天我再次將之前的筆記做了整理.希望方便盆友們的學習.
排序演算法是否穩定?
兩個相同資料的先後順序能否保證在排序後不變.
內排序和外排序
我們知道,按照待排序資料能否在你的記憶體中放得下,分為內排序和外排序.
1氣泡排序的效率:
最快0(n)
最壞O(n^2)
優點:
- 簡單
- 適合連結串列操作(只比較和修改相鄰的資料)
- 穩定.
2插入排序的效率:
最快0(n)
最壞O(n^2)
優點:
- 簡單
- 操作較少.每次比較最多移動一個數據.(相較於氣泡排序)
- 序列基本有序,則插入排序簡單高效.
- 穩定.
逆序對:
對於下標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).
快速排序程式碼實現: