最小的k個數

最小的k個數,某搜索公司的實習招聘中遇見這個題目,今天舍友討論某電子商務公司校招也出了這個題目,說明是比較經典的數據結構問題,自己再回顧發現有點模糊,有必要再整理一遍。參考資料:《劍指offer》第五章,P167

題目

輸入n個整數,找到最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4

解法1:堆排序,複雜度爲O(n*log(k))

建一個大小爲k的最大堆
對每一個數進行如下處理:

  • 如果大於或等於最大堆得根節點節點則直接pass
  • 否則如果小於最大根則將最大堆根節點替換爲該數,調整堆,具體調整策略是父節點和兩個子節點比較,將父節點和較大的子節點交換,遞歸下去,直至葉子節點

每一次堆調整的複雜度爲log(k),每來一個數調整一次堆,所以複雜度爲O(n*log(k)),可作爲外排序,內存中保存堆就行了

解法2:如果可以修改輸入數組,分區partition

快速排序算法中的分區(partition),找一個參考元素將數組分區,小於參考元素的放左邊,大於參考元素的放右邊,返回參考元素所在下標。如果返回下標小於k-1則,第k個最小元素在右邊部分,對右邊數組分區;否則如果下標大於k-1,第k個最小元素在左邊部分,對左邊數組進行分區;直至得到的分區下標爲k-1,則數組中下標爲[0,k-1]的元素爲最小的k個元素
複雜度爲o(n),因爲需要對整個數組進行修改,所以只適用於內排序

發佈了45 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章