貌似排序是在面試中經常出現的問題,那么我就來復習一下吧!
- 插入排序(insertion sort)
含義:第i趟排序將序列中第i+1個元素ki+1插入到一個已經按值有序的子序列(k'1, k'2, ..., k'i)的合適位置,得到一個長度為i+1,仍然有序的子序列(k''1, k''2, ..., k''i+1)。
優化:在尋找需要插入的位置時,可以采用折半查找對時間復雜度進行優化。
- 平均時間復雜度O(n2),采用折半查找則為O(nlogn);
- 穩定排序;
- 選擇排序(selection sort)
含義:第i趟排序從序列的后n-i+1個元素中選擇一個最小的元素與該n-i+1個元素最前的元素交換位置。
- 平均時間復雜度O(n2);
- 不穩定排序,例如(49, 38, 49', 13),一趟排序后會變成(13, 38, 49', 49),倆49交換了位置;
- 泡排序(bubble sort)
含義:比較相鄰元素,若前者較大則交換兩元素,一趟排序后最大值換到第n個位置。注意某一趟不發生元素交換時,排序完成。
- 平均時間復雜度O(n2),適用于元素基本有序的情況;
- 穩定排序;
- 謝爾排序(Shell's sort)
含義:又稱縮小增量排序。先確定一個間隔gap,將參加排序的序列按此間隔一次分成若干子序列,對子序列排序,然后縮小間隔,直至gap = 1。
- 不適用于鏈表;
- 平均時間復雜度介于O(nlogn)和O(n2)之間,略大于O(nlogn);
- 不穩定排序;
- 快速排序(quick sort)
含義:被認為是對泡排序的一種改進,又稱劃分排序法。在當前參加排序的序列(ks, ks+1, ..., kt)中任選一個元素作為分界元素,將小于等于分界元素的所有元素都移到分界元素前面,把大于等于分界員素的所有元素移到分界元素后面,這樣分界元素正好處于排序的最終位置,并把當前參加排序的序列劃分成了前后兩個子序列。
- 平均時間復雜度:O(nlogn);
- 不穩定排序;
- 堆排序(heap sort)
含義:是對選擇排序的一種改進。建立初始堆,取堆頂元素,交換堆的第1個元素和最后1個元素,將前n-1個元素再轉換為一個堆,重復取堆頂的過程。
堆的調整方法:當把第n個元素和堆頂交換后,剩余n-1個元素除堆頂外還維持堆的特性,因此將堆頂和左右孩子比較,與較大值交換,并繼續與新的左右孩子比較并進行調整。
初始堆的建立:從最后一個非孩子節點開始進行堆的調整,直至堆頂。
- 不適用于鏈表;
- 時間復雜度:O(nlogn);
- 不穩定排序;
- 歸并排序(merging sort)
含義:將兩個按值有序的序列合并成一個。
- 平均時間復雜度:O(nlogn);
- 穩定排序;
- 桶排序(Bucket sort)
含義:將數組分到有限數量的桶子里。每個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)。
- 主要適用于均勻分布的數字數組;
- 最好情況下線性時間O(n);
- 穩定排序;
總結:
編號 | 算法 | 穩定性 | 最差時間復雜度 | 平均時間復雜度 | 空間復雜度 |
---|---|---|---|---|---|
1 | 插入排序 | 穩定 | O(n2) | O(n2) | O(1) |
2 | 選擇排序 | 不穩定 | O(n2) | O(n2) | O(1) |
3 | 泡排序 | 穩定 | O(n2) | O(n2) | O(1) |
4 | 謝爾排序 | 不穩定 | O(n2) | O(nlogn)~O(n2) | O(1) |
5 | 快速排序 | 不穩定 | O(n2) | O(nlogn) | O(1) |
6 | 堆排序 | 不穩定 | O(nlogn) | O(nlogn) | O(1) |
7 | 歸并排序 | 穩定 | O(nlogn) | O(nlogn) | O(n) |