筆記:數據結構與算法之美 - 冒泡排序、插入排序、選擇排序

總結

一、排序方法與複雜度歸類
(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)。
穩定性:選擇排序不是穩定的排序算法。

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

 

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