資料結構和演算法 八大排序演算法分析和比較

2021-09-29 01:10:38 字數 2649 閱讀 7523

最近找工作面試,真的是被資料結構和演算法給反覆吊打了。

平時做專案基本都是在寫業務邏輯,即使遇到了關於資料結構演算法的東西,也是乙個介面呼叫搞定。

基礎的一些東西反而薄弱了,拿排序演算法來說吧,長時間不寫,光是記清楚演算法複雜度就夠嗆了,更別說手擼演算法了。

痛定思痛,決心還是放低心態,從基礎做起,把每個演算法親手敲一遍。

排序演算法是最基礎的演算法,也是面試官比較容易問到的演算法。就像相聲演員需要聯絡 「說學逗唱」 四門基本功一樣。

這個排序演算法就是程式設計師的基本功。

如果面試中連排序演算法都答不上來,就基本涼涼了,其他的扯再多也沒用了。

哎說多了都是淚,下面好好複習一下把。

氣泡排序

選擇排序

插入排序

快速排序

希爾排序

歸併排序

堆排序就是將小的數字慢慢往上 「冒泡」,大的數字慢慢往下 「沉底」。

每次從陣列的最後面開始迴圈,如果乙個數比它前面的數字小,那麼就交換位置。

這樣每迴圈一次,就將乙個最小值 「上浮」 到陣列前面,跟冒泡一樣。

複雜度:

每迴圈一次,就有乙個值排到了正確的位置,若要全部排好,需要迴圈 n 次。所以時間複雜度為 o(n^2)。

整個排序過程只用到了乙個中間變數,不需要額外的儲存空間,所以空間複雜度為 o(1)。

穩定性:穩定

在陣列的未排序的部分中,每次迴圈都找出乙個最小值,將這個最小值直接交換到未排序部分的最前面。

然後將選出來的這個值加入到已排序的部分中。

總的來說就是,每次遍歷都選擇乙個剩餘數中最小的值,所以叫選擇排序嘛。

複雜度:

每迴圈一次,選擇乙個最小值出來排序,所以全部完成排序需要 n 次迴圈,時間複雜度為 o(n^2)。

同樣屬於內部排序,不需要額外的儲存空間,所以空間複雜度為 o(1)。

穩定性:不穩定

陣列分成兩部分,未排序部分和已排序部分。

每次從未排序部分中按順序取出乙個值,插入到已排序部分中的對應位置。

複雜度:

插入排序需要要插入n次,每次插入時,需要遍歷陣列已排序的部分尋找插入點,並將插入點後面的元素全部後挪一位,所以時間複雜度為 o(n^2)。

雖然陣列分成未排序部分和已排序部分兩部分來分別處理,但只是邏輯上的分開,實際上還是屬於內部排序,不需要借助額外的儲存空間,所以空間複雜度為 o(1)。

穩定性:穩定

選取乙個基準元素,將陣列中所有小於基準元素的值挪到其左側,所有大於等於基準元素的值挪到其右側。

在左側和右側的序列中分別再選乙個基準元素,遞迴地方式重複進行上面的操作。

直到基準元素的左右列表都為空,即完成了排序。

複雜度:

每取陣列中乙個元素為基準,分成左右兩個部分分別進行排序,平均情況下,要遞迴 log2n 層。所以快速排序的時間複雜度為 o(nlog2n)。

快速排序由於平均需要遞迴 log2n 層,所以需要的空間複雜度為 o(log2n)。

穩定性:不穩定

插入排序的高階版,改變步長來減少元素的移動次數。步長為1時就是普通的插入排序。

步長初始為數組長的一半,此後,步長每次減半,直到為 1 。

複雜度:

在步長減為 1 之前,可以將用較少的移動次數,把陣列排成接近有序狀態,步長減為 1 時,就成了普通的插入排序,所以希爾排序的時間複雜度要比插入排序稍微低一些,大概是 o(n^1.3) 左右(未驗證)。

在空間複雜度方面,依然跟插入排序一致,為 o(1)。

穩定性:不穩定

使用遞迴-分治的思想,將陣列向下遞迴,拆分成單個的元素,然後向上拼接,成為完整陣列。

每次拼接完成的操作就是 將兩個有序陣列拼接成乙個新的有序陣列。

複雜度:

由於使用遞迴分治的方式,每次將子串行兩兩拼接,所以時間複雜度為 o(nlog2n)。

歸併演算法屬於用空間換時間,使用了 n 的額外輔助空間,所以空間複雜度為 o(n)。

穩定性:穩定

借助 二叉堆中的最大堆 來完成排序。

用陣列中的元素構造最大堆,然後每次取根節點元素(最大值)出來,加入到已排序部分。

複雜度:

由於使用了二叉堆的結構,時間複雜度為 o(nlog2n)。

空間複雜度為 o(1)。

穩定性:不穩定

下面對各種排序演算法進行比較,方便記憶。

o(n^2) :選擇排序,插入排序,氣泡排序(三個都是兩層 for 迴圈巢狀)

o(n^1.3) :希爾排序

o(nlog2n) :快速排序,歸併排序,堆排序(前兩個用了遞迴分支的思想,第三個用了二叉堆結構)

o(1) :插入排序,選擇排序,氣泡排序,希爾排序,堆排序

o(n) :歸併排序(空間換時間)

o(log2n) :快速排序(空間換時間)

穩定:插入排序,氣泡排序,歸併排序

不穩定:希爾排序,選擇排序,快速排序,堆排序

資料結構八大排序演算法

常見的八大排序演算法,他們之間關係如下 直接插入排序 definsert sort l 遍歷陣列中的所有元素,其中0號索引元素預設已排序,因此從1開始 for x in range 1 len l 將該元素與已排序好的前序陣列依次比較,如果該元素小,則交換 range x 1,1,1 從x 1倒序迴...

資料結構常見的八大排序演算法

python實現 排序演算法 內部排序 外部排序 內部排序 插入 選擇 交換 歸併 基數排序 插入排序 直接插入排序 希爾排序 選擇排序 簡單選擇排序 堆排序 交換排序 氣泡排序 快速排序 定義乙個公用函式 function swap myarray,p1,p2 function insertion...

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...