面試中常用的算法——排序

學習算法的好處
學習算法的過程其實是一個提高思維能力的過程。

基本的排序算法(簡單直接幫助迅速寫出沒有bug的代碼)
冒泡排序/Bubble Sort
插入排序/Insertion Sort

常考的排序算法(解決絕大部分設計排序問題的關鍵)
歸併排序/Merge Sort
快速排序/Quick Sort
拓撲排序/Topological Sort

其他排序算法(掌握好它的解題思想能開闊解題思路)
堆排序/Heap Sort
桶排序/Bucket Sort

冒泡排序

冒泡排序的算法思想
每一輪,從雜亂無章的數組頭部開始,每兩個元素比較大小並進行交換;
直到這一輪當中最大或最小的元素被放置在數組的尾部;
然後,不斷地重複這個過程,直到所有元素都排好位置。

冒泡排序空間複雜度:O(1)
假設數組的元素個數是n,整個排序的過程中,直接在給定的數組裏進行元素的兩兩交換。

冒泡排序的時間複雜度:O(n^2)
情景一:給定的數組按照順序已經排好
只需要進行n-1次的比較,兩兩交換次數爲0,時間複雜度是O(n),這是最好的情況。

情景二: 給定的數組按照逆序排列
只需要進行n(n-1)/2次比較,時間複雜度是O(n^2),這是最壞的情況。

情景三:給定的數組雜亂無章
在這種情況下,平均時間複雜度是O(n^2)。

冒泡排序是一種穩定的排序算法,所謂的穩定,也就是說,對於數組裏兩個相等的數,經過排序後這兩個數的相對位置保持不變。

插入排序

插入排序與冒泡排序的對比
在冒泡排序中,經過每一輪的排序處理後,數組後端的數是排好序的;
在插入排序中,經過每一輪的排序處理後,數組前段的數都是排好序的。

插入排序的算法思想
不斷地將尚未排好序的數插入到已經排好序的部分。

插入排序的空間複雜度:O(1)
假設數組的元素個數是n,整個排序的過程中,直接在給定的數組裏進行元素的兩兩交換。

插入的時間複雜度:O(n^2)
情景一:給定的書庫按照順序已經排好
只需要進行n-1次的比較,亮亮交換次數爲0,時間複雜度是O(n),這是最好的情況。
情景二:給定的數組按照逆序排列
需要進行n(n-1)/2次比較,時間複雜度是O(n^2),這是最壞的情況。
情景三:給定的數組雜亂無章
在這種情況下,平均時間複雜度是O(n^2)

插入排序也是一種穩定的排序算法

歸併排序

分治的思想
歸併排序的核心思想是分治,把一個複雜問題拆分成若干個子問題來求解。

歸併排序的算法思想
把數組總中間劃分成兩個子數組;
已知遞歸地把子數組劃分成更小的子數組,直到子數組裏面只有一個元素;
依次按照遞歸的返回順序,不斷地合併排好序的子數組,直到最後把整個數組的順序排好。

歸併排序的時間複雜度: T(n)
歸併算法是一個不斷遞歸的過程,假設數組的元素個數是n。
時間複雜度是T(n)的函數:T(n)=2*T(n/2) + O(n)
如何解這個公式?
對於規模爲n的問題,一共要進行log(n)層的小大切分;
每一層的合併複雜度都是O(n)
所以整體的複雜度就是O(nlogn)

歸併排序的空間複雜度:O(n)
由於合併n個元素需要分配一個大小爲n的額外數組,合併完成之後,這個數組的空間就會被釋放。

歸併排序也是穩定的排序算法。

快速排序

快速排序的算法思想
快速排序也採用了分治的思想;
把原始的數組篩選成較小和較大兩個子數組,然後遞歸地排序兩個子數組;
在分成較小和較大的兩個子數組過程中,如何選定一個基準值尤爲關鍵。

需要注意的是:
快速排序是直接在原始數組裏進行各種操作的,所以當子數組被分割出來時,原始數組裏的排序也被改變了。

快速排序最優情況下的時間複雜度
T(n)=2*T(N-1)+O(n)

O(n)的由來:
把規模大小爲n的問題分解成n/2的兩個子問題;
和基準值進行n-1次比較,n-1次的比較的複雜度就是O(n)
這種情況下快速排序的複雜度也是O(nlogn)

快速排序最複雜的情況
每次在選擇基準值的時候,都不幸選擇了子數組裏的最大或最小值
其中一個子數組長度爲1
另一個長度只比父數組少1
此時的情況類似於冒泡排序,這意味着在最壞情況下快速排序的時間複雜度爲O(n^2)
然而,可以通過隨機地選取基準值就可以避免這種最壞的情況

快速排序的空間複雜度:O(logn)
和歸併排序不同快速排序再每次遞歸的過程中
只需要開闢O(1)的存儲空間來完成交換操作實現直接對數組的修改
而遞歸次數爲logn,所以它的整體空間複雜度完全取決於壓堆棧的次數。

拓撲排序

拓撲排序的應用場合
拓撲排序就是要將圖論裏的頂點按照相連的性質進行排序

拓撲排序的前提
必須是有向圖
圖裏沒有環

拓撲排序的時間複雜度:O(n)
統計頂點的入度需要O(n)的時間
接下來每個頂點被遍歷一次,同樣需要O(n)的時間

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