最近找工作面試,真的是被資料結構和演算法給反覆吊打了。排序演算法是最基礎的演算法,也是面試官比較容易問到的演算法。就像相聲演員需要聯絡 「說學逗唱」 四門基本功一樣。平時做專案基本都是在寫業務邏輯,即使遇到了關於資料結構演算法的東西,也是乙個介面呼叫搞定。
基礎的一些東西反而薄弱了,拿排序演算法來說吧,長時間不寫,光是記清楚演算法複雜度就夠嗆了,更別說手擼演算法了。
痛定思痛,決心還是放低心態,從基礎做起,把每個演算法親手敲一遍。
這個排序演算法就是程式設計師的基本功。
如果面試中連排序演算法都答不上來,就基本涼涼了,其他的扯再多也沒用了。
哎說多了都是淚,下面好好複習一下把。
氣泡排序
選擇排序
插入排序
快速排序
希爾排序
歸併排序
堆排序就是將小的數字慢慢往上 「冒泡」,大的數字慢慢往下 「沉底」。
每次從陣列的最後面開始迴圈,如果乙個數比它前面的數字小,那麼就交換位置。
這樣每迴圈一次,就將乙個最小值 「上浮」 到陣列前面,跟冒泡一樣。
複雜度:
每迴圈一次,就有乙個值排到了正確的位置,若要全部排好,需要迴圈 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 ...