18.6 設計一個算法,給定10億個數字,找出最小的100萬個數字。假定計算機內存足以容納全部10億個數字。
解法:
方法1:排序
按升序排序所有的元素,然后取出前100萬個數,時間復雜度為O(nlog(n))
方法2:大頂堆
我們可以使用大頂堆來解題。首先,為前100萬個數字創建一個大頂堆
然后,遍歷整個數列,將每個元素插入大頂堆,并刪除最大的元素。
遍歷結束后,我們將得到一個堆,剛好包含最小的100萬個數字。這個算法的時間復雜度為O(nlog(m)),其中m為待查找數值的數量。
方法3:選擇排序算法(假如你可以改變原始數組)
在計算機科學中,選擇排序是個很有名的算法,可以在線性時間內找到數組中第i個最小(或最大)元素。
如果這些元素各不相同,則可以在預期的O(n)時間內找到第i個最小的元素。
?