各種排序算法時間復雜度及穩定性


如下表:

一、插入排序

  每次將一個待排序的數據,跟前面已經有序的序列的數字一一比較找到自己合適的位置,插入到序列中,直到全部數據插入完成。

二、希爾排序

  先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然后依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的數據進行直接插入排序,因此可以形象的稱希爾排序為“跳着插”。

三、冒泡排序

  通過交換使相鄰的兩個數變成小數在前大數在后,這樣每次遍歷后,最大的數就“沉”到最后面了。重復N次即可以使數組有序。

  冒泡排序改進1:在某次遍歷中如果沒有數據交換,說明整個數組已經有序。因此通過設置標志位來記錄此次遍歷有無數據交換就可以判斷是否要繼續循環。

  冒泡排序改進2:記錄某次遍歷時最后發生數據交換的位置,這個位置之后的數據顯然已經有序了。因此通過記錄最后發生數據交換的位置就可以確定下次循環的范圍了。

四、快速排序

  “挖坑填數+分治法”,首先令i =L; j = R; 將a[i]挖出形成第一個坑,稱a[i]為基准數。然后j--由后向前找比基准數小的數,找到后挖出此數填入前一個坑a[i]中,再i++由前向后找比基准數大的數,找到后也挖出此數填到前一個坑a[j]中。重復進行這種“挖坑填數”直到i==j。再將基准數填入a[i]中,這樣i之前的數都比基准數小,i之后的數都比基准數大。因此將數組分成二部分再分別重復上述步驟就完成了排序。

五、選擇排序

   數組分成有序區和無序區,初始時整個數組都是無序區,然后每次從無序區選一個最小的元素直接放到有序區的最后,直到整個數組變有序區。

六、堆排序

6.1、二叉堆定義:

二叉堆是完全二叉樹或近似完全二叉樹。二叉堆滿足兩個特性:

(1)父結點的鍵值總是大於或者等於(小於或者等於)任何一個子節點的鍵值;

(2)每個結點的左子樹和右子樹都是一個二叉堆;

當父結點的鍵值總是大於或者等於任何一個子節點的鍵值時為大根堆。當父結點的鍵值總是小於或等於任何一個子節點的鍵值時為小根堆;

6.2、堆的存儲:

一般都用數組來表示堆,i結點的父結點下標就為(i-1)/2.它的左右子節點的下標分別為2*i+1和2*i+2.

 

6.3 排序思想

基本思想:

1.首先將待排序的數組構造成一個大根堆,此時,整個數組的最大值就是堆結構的頂端

2.將頂端的數與末尾的數交換,此時,末尾的數為最大值,剩余待排序數組個數為n-1

3.將剩余的n-1個數再構造成大根堆,再將頂端數與n-1位置的數交換,如此反復執行,便能得到有序數組

 具體排序過程可見https://blog.csdn.net/u010452388/article/details/81283998

6.4、應用

尋找M個數中的前K個最小的數並保持有序;

時間復雜度:O(K)[創建K個元素最大堆的時間復雜度] +(M-K)*log(K)[對剩余M-K個數據進行比較並每次對最大堆進行從新最大堆化]

七、歸並排序

   歸並排序主要分為兩步:分數列(divide),每次把數列一分為二,然后分到只有兩個元素的小數列;合數列(Merge),合並兩個已經內部有序的子序列,直至所有數字有序。用遞歸可以實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM