時間複雜度為 o(nlogn) 的三種排序演算法
2. 排序演算法的三個分析指標
最常用的排序演算法:
氣泡排序、插入排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序。
按照時間複雜度可分為三類:
氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求。如果不滿足就讓它倆互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。
這個冒泡過程還可以優化。當某次冒泡操作已經沒有資料交換時,說明已經達到完全有序,不用再繼續執行後續的冒泡操作。
插入排序(insertion sort):放在已排序區間比較
將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。
如下圖,要排序的資料是 4,5,6,1,3,2,其中左側為已排序區間,右側是未排序區間。
選擇排序(selection sort):在未排序區間進行比較
選擇排序演算法也分已排序區間和未排序區間,每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。
希爾排序也稱遞減增量排序演算法,是基於插入排序的改進版本。 基本思想是: 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序 待整個序列中的記錄"基本有序"時,再對全體記錄進行依次直接插入排序。
歸併排序和快速排序是時間複雜度為 o(nlogn) 的排序演算法,這兩種排序演算法適合大規模的資料排序,比時間複雜度為 o(n2) 的排序演算法要更常用。
歸併排序和快速排序是兩種稍微複雜的排序演算法,它們用的都是分治的思想,**都通過遞迴來實現,過程非常相似。理解歸併排序的重點是理解遞推公式和 merge() 合併函式。同理,理解快排的重點也是理解遞推公式,還有 partition() 分割槽函式。
歸併排序演算法是一種在任何情況下時間複雜度都比較穩定的排序演算法,這也使它存在致命的缺點,即歸併排序不是原地排序演算法,空間複雜度比較高,是 o(n)。正因為此,它也沒有快排應用廣泛。
快速排序演算法雖然最壞情況下的時間複雜度是 o(n2),但是平均情況下時間複雜度都是 o(nlogn)。不僅如此,快速排序演算法時間複雜度退化到 o(n2) 的概率非常小,可以通過合理地選擇 pivot 來避免這種情況。
排序演算法的執行效率,一般從這幾個方面來衡量:
(1)最好情況、最壞情況、平均情況時間複雜度
要分別給出最好情況、最壞情況、平均情況下的時間複雜度,並說出最好、最壞時間複雜度對應的要排序的原始資料是什麼樣的。
有序度是陣列中具有有序關係的元素對的個數。表示式:有序元素對:a[i] <= a[j], 如果 i < j。
對於乙個倒序排列的陣列,有序度是 0;完全有序的陣列的有序度叫作滿有序度;
逆序度的定義正好跟有序度相反(預設從小到大為有序):逆序元素對:a[i] > a[j], 如果 i < j
逆序度 = 滿有序度 - 有序度。
排序的過程就是一種增加有序度,減少逆序度的過程,最後達到滿有序度,就說明排序完成了。
(2)時間複雜度的係數、常數 、低階
時間複雜度反應的是資料規模 n 很大的時候的乙個增長趨勢,它會忽略係數、常數、低階。
但排序的是 1000 以內規模很小的資料,對同階時間複雜度的排序演算法效能對比的時候,應當把係數、常數、低階也考慮進來。
(3)比較次數和交換(或移動)次數
基於比較的排序演算法的執行過程,會涉及元素比較大小和元素交換或移動兩種操作。
在分析排序演算法的執行效率的時候,應該把比較次數和交換(或移動)次數也考慮進去。
演算法的記憶體消耗可以通過空間複雜度來衡量。
原地排序(sorted in place)演算法,是特指空間複雜度是 o(1) 的排序演算法。
穩定性是指如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變。
比如有一組資料 2,9,3,4,8,3,按照大小排序之後是 2,3,3,4,8,9。
這組資料裡有兩個 3。經過某種排序演算法排序之後,如果兩個 3 的前後順序沒有改變,那我們就把這種排序演算法叫作穩定的排序演算法;如果前後順序發生變化,那對應的排序演算法就叫作不穩定的排序演算法。
Python資料結構與演算法5 排序演算法1
1.氣泡排序 defbubble sort alist n len alist for i in range n 1 第一層迴圈 冒泡需要進行的輪數 count 0for j in range n 1 i 第二層迴圈 遍歷兩兩比較 if alist j alist j 1 alist j alist...
資料結構與演算法(九)排序
演算法 時間複雜度 平均 時間複雜度 最壞 時間複雜度 最好 空間複雜度 穩定性氣泡排序 o n 2 o n 2 o n o 1 穩定選擇排序 o n 2 o n 2 o n 2 o 1 不穩定插入排序 o n 2 o n 2 o n o 1 穩定希爾排序 o nlogn o n 2 o n o 1...
資料結構與演算法 四 排序
def heap sort li def heapfly li start len li 2 1 獲取最後乙個葉子節點的父節點 for nod in range start,1,1 left 2 nod 1 right min left 1,len li 1 temp left if li left...