多種排序演算法的比較

來源:互聯網
上載者:User

標籤:strong   資料   工作   時間   演算法   on   如何   最佳化   

1.冒泡排序和選擇排序

為什麼把冒泡排序和選擇排序放在一塊兒呢?因為我發現他們兩個有點像。

冒泡排序是不停的把最大的元素換到數組的最右端。

而選擇排序是把最小的元素換到最左端。

看到這兒,你是不是覺得冒泡和選擇好像沒啥區別啊,把最大換成最小就成了一種新的演算法?那我也來一個?

其實,無論換最大還是最小,都無關緊要,就算冒泡變成換最小的元素換到數組的最左端,那它也叫冒泡排序的。

 

冒泡排序的描述:它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到不需要交換,也就是說該數列已經排序完成。

選擇排序的描述:每一趟從待排序的資料元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

為了便於描述二者之間的區別,我們把冒泡和排序都換成是把最大元素換到最右端。

他們的最大區別在於

冒泡排序不停比較兩個相鄰的元素,並不斷交換較大的元素,直到數組尾。

選擇排序開始只比較不交換,直到數組尾才進行一次交換。

在這裡,你可以認為選擇排序是冒泡排序的最佳化,因為選擇排序多數時候減少了交換的次數,卻實現了相同的效果。

難道冒泡排序多做的那些交換就全是無用功嗎?仔細想想,當然不是這樣!

仔細看看冒泡排序是怎麼說的,“走訪數列的工作是重複地進行直到不需要交換”,這個很重要,假如我們加入一個變數,來記錄交換次數,當某趟遍曆交換次數為零的時候,說明數組已經排序好了,那就可以結束排序了!

比如“1,2,3,4,5,6,7,8,9”,對於這樣一個數組,冒泡排序只需要進行一次遍曆就ok了,所以對於基本有序的數組,冒泡可以做到O(n)的複雜度。

但是選擇排序做不到這一點,一個已經有序的數組和隨機排列的數組將花差不多的時間(稍微會少點,因為有序數組不需要交換,只需要比較)。

在這裡,我們發現,選擇排序並沒有利用數組的初始輸入狀態,而冒泡排序利用了。這是冒泡的優勢,在這裡,你可能會想,冒泡是如何利用初始狀態的呢?當然就是在一次又一次相鄰元素的比較上嘛。

最後,由於選擇排序會交換不相鄰元素,比如直接把a[0]和a[8]交換位置,導致了選擇排序的不穩定。而冒泡只會交換相鄰元素,所以冒泡是穩定的,我們當然不會蠢到a[0]=1,a[1]=1的時候交換他們的位置是吧。

待會兒我們會分析插入排序和希爾排序,這兩個排序的穩定性的原因分析也和是否交換不相鄰元素有關。

先到這兒,明天再寫。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.