程序員編程藝術3:尋找最小的k個數

尋找最小的k個數
題目描述:5.查找最小的k個元素
題目:輸入n個整數,輸出其中最小的k個。

例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字爲1,2,3和4.

原文:http://blog.csdn.net/v_july_v/article/details/6370650

總結思路:

(1)排序後,輸出前面最k個,時間複雜度跟時間複雜度有關,如果是快速排序O(nlogn + k)

(2)只排序前面的k個元素,如果選擇排序,時間複雜度O(k*n)

(3)只排序前面的k個元素,如果堆排序是(維護k個節點的最大堆),時間複雜度O(n*logk)

(4)按編程之美第141頁上解法二的所述,類似快速排序的劃分方法,N個數存儲在數組S中,再從數組中隨機選取一個數X(隨機選取樞紐元,可做到線性期望時間O(N)的複雜度,在第二節論述),把數組劃分爲Sa和Sb倆部分,Sa<=X<=Sb,如果要查找的k個元素小於Sa的元素個數,則返回Sa中較小的k個元素,否則返回Sa中所有元素+Sb中小的k-|Sa|個元素。像上述過程一樣,這個運用類似快速排序的partition的快速選擇SELECT算法尋找最小的k個元素,在最壞情況下亦能做到O(N)的複雜度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章