【數據結構與算法之美】排序(上):爲什麼插入排序比冒泡排序更受歡迎?

目錄

一、排序方法與複雜度歸類

二、如何分析一個“排序算法”?

三、冒泡排序

四、插入排序

五、選擇排序

六、課後思考


一、排序方法與複雜度歸類

(1)幾種最經典、最常用的排序方法:冒泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。
(2)複雜度歸類
冒泡排序、插入排序、選擇排序 O(n^2)
快速排序、歸併排序 O(nlogn)
計數排序、基數排序、桶排序 O(n)

二、如何分析一個“排序算法”?

1.  算法的執行效率
1)最好、最壞、平均情況時間複雜度。
2)時間複雜度的係數、常數和低階。
3)比較次數,交換(或移動)次數。
2. 排序算法的穩定性
1)穩定性概念:如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變。
2)穩定性重要性:可針對對象的多種屬性進行有優先級的排序。
3)舉例:給電商交易系統中的“訂單”排序,按照金額大小對訂單數據排序,對於相同金額的訂單以下單時間早晚排序。用穩定排序算法可簡潔地解決。先按照下單時間給訂單排序,排序完成後用穩定排序算法按照訂單金額重新排序。
3. 排序算法的內存損耗
原地排序算法:特指空間複雜度是O(1)的排序算法。

三、冒泡排序

       冒泡排序只會操作相鄰的兩個數據。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足就讓它倆互換。
穩定性:冒泡排序是穩定的排序算法。
空間複雜度:冒泡排序是原地排序算法。
時間複雜度:
1. 最好情況(滿有序度):O(n)。
2. 最壞情況(滿逆序度):O(n^2)。
3. 平均情況:
       “有序度”和“逆序度”:對於一個不完全有序的數組,如4,5,6,3,2,1,有序元素對爲3個(4,5),(4,6),(5,6),有序度爲3,逆序度爲12;對於一個完全有序的數組,如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15,稱作滿有序度;逆序度=滿有序度-有序度;冒泡排序、插入排序交換(或移動)次數=逆序度。
       最好情況下初始有序度爲n*(n-1)/2,最壞情況下初始有序度爲0,則平均初始有序度爲n*(n-1)/4,即交換次數爲n*(n-1)/4,因交換次數<比較次數<最壞情況時間複雜度,所以平均時間複雜度爲O(n^2)。

四、插入排序

       插入排序將數組數據分成已排序區間和未排序區間。初始已排序區間只有一個元素,即數組第一個元素。在未排序區間取出一個元素插入到已排序區間的合適位置,直到未排序區間爲空。
空間複雜度:插入排序是原地排序算法。
時間複雜度:
1. 最好情況:O(n)。
2. 最壞情況:O(n^2)。
3. 平均情況:O(n^2)(往數組中插入一個數的平均時間複雜度是O(n),一共重複n次)。
穩定性:插入排序是穩定的排序算法。

五、選擇排序

       選擇排序將數組分成已排序區間和未排序區間。初始已排序區間爲空。每次從未排序區間中選出最小的元素插入已排序區間的末尾,直到未排序區間爲空。
空間複雜度:選擇排序是原地排序算法。
時間複雜度:(都是O(n^2))
1. 最好情況:O(n^2)。
2. 最壞情況:O(n^2)。
3. 平均情況:O(n^2)。
穩定性:選擇排序不是穩定的排序算法。

六、課後思考

1. 鏈表能實現冒泡排序、選擇排序、插入排序算法嗎?如果能,那相應的時間、空間複雜度又是多少呢?              
 

方法 最好時間複雜度 最壞時間複雜度 平均時間複雜度
冒泡 O(n) O(n²) O(n²)
插入 O(n) O(n²) O(n)
選擇 O(n²) O(n²) O(n²)

2. 選擇排序和插入排序的時間複雜度相同,都是O(n^2),在實際的軟件開發中,爲什麼我們更傾向於使用插入排序而不是冒泡排序算法呢?
       解答:從代碼實現上來看,冒泡排序的數據交換要比插入排序的數據移動要複雜,冒泡排序需要3個賦值操作,而插入排序只需要1個,所以在對相同數組進行排序時,冒泡排序的運行時間理論上要長於插入排序。

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