快排,堆排序介紹

快速排序

首先任意選取一個數據(通常選用數組的第一個數)作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序

最好情況:每次劃分過程產生的區間大小都爲n/2,一共需要劃分log2n次,每次需要比較n-1次,O(nlog2n)
最壞情況:每次劃分過程產生的兩個區間分別包含n-1個元素和1個元素,一共需要劃分n-1次,每次最多交換n-1次,這就是冒泡排序了,O(n2)

堆排序

  1. 根據初始數組去構造初始堆(構建一個完全二叉樹,保證所有的父結點都比它的孩子結點數值大)。
  2. 每次交換第一個和最後一個元素,輸出最後一個元素(最大值),然後把剩下元素重新調整爲大根堆。

堆排序過程的最好和最壞時間複雜度是O(nlog2n)

TOP K

如何在N個元素中尋找前K大的數?

快速排序:

  • 原理:每次快速排序中的劃分過程能找到一個全部大於左邊元素的一個值。如果該值的位置等於K,那麼這個值和它左邊的所有元素就是前K大的數;如果該值的位置小於K,那麼對右邊的元素繼續劃分排序;如果該值的位置大於K,那麼對左邊的元素繼續劃分排序
  • 問題:但空間複雜度是O(N),如果你要在很多元素中找很少幾個top K的元素,或者在一個巨大的數據流裏找到top K,快速排序是不合適的,堆排序更省地方

堆排序:

  • 原理:申請一個容量爲K的數組,存入數組的前K個元素,創建長度爲K的最小堆;從K開始循環數組的剩餘元素,如果元素(a)比最小堆的根節點大,將a設置成最小堆的根節點,然後重建最小堆;循環完成後,最小堆中的所有元素就是需要找的最大的K個元素。
  • 優點:可以在N個元素中找到top K,時間複雜度是O(N log K),空間複雜的是O(K)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章