一、穩定性:
穩定:氣泡排序、插入排序、歸併排序和基數排序
不穩定:選擇排序、快速排序、希爾排序、堆排序
二、平均時間複雜度
o(n^2):直接插入排序,簡單選擇排序,氣泡排序。
在資料規模較小時(9w內),直接插入排序,簡單選擇排序差不多。當資料較大時,氣泡排序演算法的時間代價最高。效能為o(n^2)的演算法基本上是相鄰元素進行比較,基本上都是穩定的。
o(nlogn):快速排序,歸併排序,希爾排序,堆排序。
其中,快排是最好的, 其次是歸併和希爾,堆排序在資料量很大時效果明顯。
三、排序演算法的選擇
1.資料規模較小
(1)待排序列基本序的情況下,可以選擇直接插入排序;
(2)對穩定性不作要求宜用簡單選擇排序,對穩定性有要求宜用插入或冒泡
2.資料規模不是很大
(1)完全可以用記憶體空間,序列雜亂無序,對穩定性沒有要求,快速排序,此時要付出log(n)的額外空間。
(2)序列本身可能有序,對穩定性有要求,空間允許下,宜用歸併排序
3.資料規模很大
(1)對穩定性有求,則可考慮歸併排序。
(2)對穩定性沒要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡
詳細的穩定性分析:
(1)直接插入排序:一般插入排序,比較是從有序序列的最後乙個元素開始,如果比它大則直接插入在其後面,否則一直往前比。如果找到乙個和插入元素相等的,那麼就插入到這個相等元素的後面。插入排序是穩定的。
(2)希爾排序:希爾排序是按照不同步長對元素進行插入排序,一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,穩定性就會被破壞,所以希爾排序不穩定。
(3)簡單選擇排序:在一趟選擇,如果當前元素比乙個元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。光說可能有點模糊,來看個小例項:8 5 8 4 10,第一遍掃瞄,第1個元素8會和4交換,那麼原序列中2個8的相對前後順序和原序列不一致了,所以選擇排序不穩定。
(4)堆排序:堆排序的過程是從第n/2開始和其子節點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當然不會破壞穩定性。但當為n/2-1, n/2-2, ...這些父節點擊擇元素時,有可能第n/2個父節點交換把後面乙個元素交換過去了,而第n/2-1個父節點把後面乙個相同的元素沒有交換,所以堆排序並不穩定。
(5)氣泡排序:由前面的內容可知,氣泡排序是相鄰的兩個元素比較,交換也發生在這兩個元素之間,如果兩個元素相等,不用交換。所以氣泡排序穩定。
(6)快速排序:在中樞元素和序列中乙個元素交換的時候,很有可能把前面的元素的穩定性打亂。還是看乙個小例項:6 4 4 5 4 7 8 9,第一趟排序,中樞元素6和第三個4交換就會把元素4的原序列破壞,所以快速排序不穩定。
(7)歸併排序:在分解的子列中,有1個或2個元素時,1個元素不會交換,2個元素如果大小相等也不會交換。在序列合併的過程中,如果兩個當前元素相等時,我們把處在前面的序列的元素儲存在結果序列的前面,所以,歸併排序也是穩定的。
(8)基數排序:是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優先順序排序,最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。基數排序基於分別排序,分別收集,所以是穩定的。
8種排序的分類,穩定性,時間複雜度和空間複雜度總結:
八種排序演算法總結
插入排序 1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void s...
五種排序方法總結
此次介紹的是五種排序的方法 1.氣泡排序 2.選擇排序 3.快速排序 4.插入排序 5。二分查詢 1 冒泡法,即利用相鄰的兩個數之間來比較達到交換的目的 從而把最大或最小的數 移到某一邊。故而 此種方法要 進行多個趟次與比較多次。例如 n個數字,則要進行n 1趟比較。在第m趟中要進行n m次兩兩之間...
Python中八種基本排序方法
1.選擇排序方法 def select sort l for i in range 0,len l minl l i for j in range i 1,len l if l j minl temp l j l j minl minl temp l i minl選擇排序不過多解釋,只是通過遍歷把每...