三大計算機排序算法-冒泡,選擇,插入比較


1比較維度


前面我們分別講了三種排序算法:冒泡排序,選擇排序,插入排序,那麼大家肯定會有個問題,我該選擇哪種算法?

三大計算機排序算法-冒泡,選擇,插入比較

評價一個算法的優劣,可以從四方面入手:

  • 排序算法的執行效率,要考慮最好情況,最差情況和平均情況。

  • 排序算法的內存消耗。

  • 排序算法的穩定性。

  • 哪種算法代碼更簡單。




2算法比較


第一項:通過之前的文章我們已經知道,在基本有序數據進行排序時,冒泡排序和插入排序都是與n成正比,選擇排序與n2成正比。

完全逆序的時候,三種算法都是與n2成正比,所以要比較一下細節:冒泡比較次數是n(n-1)/2,交換次數是3*n(n-1)/2,總次數是2n(n-1),選擇排序比較次數是n(n-1)/2, 交換次數是2(n-1)次,總次數是n(n+3)/2-2, 插入排序總次數是n(n+1)-2。 最差的情況下從執行效率上來說插入排序 略優於 選擇排序 略優於 冒泡排序

在平均情況下,排序記錄是隨機的,那麼根據概率相同的原則:冒泡排序比較次數不會變,交換次數每次降到最差情況的1/2。選擇排序比較次數佔大頭,並且不會變。所以最差,最好和平均情況相差不大。插入排序比較次數每次會降到最差情況的1/2, 移動次數每次也幾乎會降為最差情況的1/2。所以

平均情況下三種排序依然是與n2成正比,經過計算依然是:插入排序 略優於 選擇排序 略優於 冒泡排序(計算過程略)。


第二項:三種算法除了待排序數據本身都幾乎沒有藉助其他內存空間,也就是原地排序,所以這一項三種算法一致。

第三項:所謂的算法穩定性,就是當列表中有兩個一樣的數字時候,經過排序之後這兩個數字順序是否會變化?假設有如下的考試成績數據,大家如果足夠細心的話會發現是按照姓名字母排序的。
李市民 90

劉幫 70

張三瘋 70

趙狂飲 75

朱院長 60
現在我們想按照分數排序,排完序後的數據需要姓名還是按原來字母順序排列的。也就是這樣的順序(劉幫和張三瘋的順序沒有變),如果是這樣的順序就是穩定的:
李市民 90

趙狂飲 75

劉幫 70

張三瘋 70

朱院長 60
我們會發現用冒泡排序和插入排序都不會導致順序產生變化,而只有選擇排序會導致順序問題。如果是全國高考進行一個成績排名,1000多萬的數據,如果姓名順序產生變化,將非常不好找。而算法是否能導致相同數據的位置產生變化就叫算法的穩定性

第四項:哪種代碼更簡單,似乎差不太多,個人感覺選擇排序更容易理解,其次是冒泡排序,然後是插入排序。大家也可以在留言裡說出自己的看法。
所以三種排序算法的比較如下(O()是算法中的大O表示法,大家直接理解成時間消耗與n成正比,還是與n2成正比就可以)

三大計算機排序算法-冒泡,選擇,插入比較


3結論


經過比較,基本可以得到結論,在三者之中,插入排序略顯優秀一些,如果代碼能夠輕鬆理解,正常情況下就用插入排序。既然插入排序更優秀,為什麼還要學習其他兩種排序方法?舉個例子,會打籃球的人,都知道藍球技巧包括:左右換手,背後運球,胯下運球... 也許有一種技巧過人的概率更大,但是不同情況下還是要選擇不同的技巧,技不壓人,那麼排序技巧也是一樣的。


三大計算機排序算法-冒泡,選擇,插入比較


同時我感覺學習這些排序並不是為了用各種方法把數字排好,如果真的是這樣,學習一種排序就可以了。通過這些天對這些排序方法的梳理,我發現對數字的感覺提升了。這就像一個藍球新手面對對手攔截的時候感到毫無頭緒去突破,而對一個人球一體的高手來說,想怎麼突破就怎麼突破。就像掌握藍球是從培養球感開始,而與數字打交道就是從培養數感開始,學習這些排序方法就是對批量數字感覺的一種培養途徑。



分享到:


相關文章: