18.6 设计一个算法,给定10亿个数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。
解法:
方法1:排序
按升序排序所有的元素,然后取出前100万个数,时间复杂度为O(nlog(n))
方法2:大顶堆
我们可以使用大顶堆来解题。首先,为前100万个数字创建一个大顶堆
然后,遍历整个数列,将每个元素插入大顶堆,并删除最大的元素。
遍历结束后,我们将得到一个堆,刚好包含最小的100万个数字。这个算法的时间复杂度为O(nlog(m)),其中m为待查找数值的数量。
方法3:选择排序算法(假如你可以改变原始数组)
在计算机科学中,选择排序是个很有名的算法,可以在线性时间内找到数组中第i个最小(或最大)元素。
如果这些元素各不相同,则可以在预期的O(n)时间内找到第i个最小的元素。