經典的幾個排序算法


插入排序

步驟:

  1. 從第一個元素開始,該元素可以認為已經被排序
  2. 取出下一個元素,在已經排序的元素序列中從后向前掃描
  3. 如果該元素(已排序)大於新元素,將該元素移到下一位置
  4. 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
  5. 將新元素插入到該位置中
  6. 重復步驟2
 
 

穩定 
空間復雜度O(1) 
時間復雜度O(n2) 
最差情況:反序,需要移動n*(n-1)/2個元素 
最好情況:正序,不需要移動元素

 

在列表已被排序時,插入排序是線性算法O(n)。

在列表“近似排序”時,插入排序仍然是線性算法。

因而,插入排序不適合對於數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小於千,那么插入排序還是一個不錯的選擇。

 

 

冒泡排序

 

步驟:(從后往前)
  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
  3. 針對所有的元素重復以上的步驟,除了最后一個。
  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
 
穩定 
空間復雜度O(1) 
時間復雜度O(n2) 
冒泡排序的最壞時間復雜度為O(n2)。 算法的平均時間復雜度為O(n2) 。冒泡排序最好的時間復雜度為O(n)。
 
 
快速排序

 

原理,通過一趟掃描將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,
然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
 

不穩定,時間復雜度 最理想 O(nlogn) 最差時間O(n^2) 平均復雜度O(nlogn)

 
堆排序
 

這里的堆(二叉堆),指得不是堆棧的那個堆,而是一種數據結構。

堆可以視為一棵完全的二叉樹,完全二叉樹的一個“優秀”的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用數組來表示,每一個結點對應數組中的一個元素.

數組與堆之間的關系

什么是最大堆

堆中每個父節點的元素值都大於等於其孩子結點(如果存在),這樣的堆就是一個最大堆

因此,最大堆中的最大元素值出現在根結點(堆頂)

堆排序就是把堆頂的最大數取出,

將剩余的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞歸實現

 

不穩定,時間復雜度 最理想 O(nlogn) 最差時間O(nlogn) 平均復雜度O(nlogn)

 
 
時間復雜度和空間復雜度
 

時間復雜度是程序運行的時間,也可以說是次數;
空間復雜度是程序占用的空間;

 
精辟:
 
要在 hash 表中找到一個元素就是 O(1)
要在無序數組中找到一個元素就是 O(n)

訪問數組的第 n 個元素是 O(1)
訪問鏈表的第 n 個元素是 O(n)



 
 
 
 

 

 


免責聲明!

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



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