输入 n 个随机的整数,输出其中最小的 k 个。要求尽量小地使用内存,尽量快地计算 出结果。(要求不能使用第三方库中的排序函数) 例如:输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4。
时间: 2023-12-12 11:03:31 浏览: 35
输入n个整数,输出其中最小的k个
这是一个经典的问题,可以使用堆排序来解决。
算法步骤如下:
1.读入n个整数;
2.构建一个大小为k的最大堆;
3.将前k个整数插入到最大堆中;
4.对于第 k+1 到第 n 个整数,如果它小于最大堆堆顶的元素,则将它插入到最大堆中,并将最大堆堆顶元素删除;
5.最后,最大堆中剩下的k个元素就是最小的k个整数。
时间复杂度为 O(nlogk),空间复杂度为 O(k)。
以下是Python代码实现:
```python
import heapq
def get_least_numbers(arr, k):
if not arr or k <= 0 or k > len(arr):
return []
max_heap = []
for i in range(k):
heapq.heappush(max_heap, -arr[i])
for i in range(k, len(arr)):
if -arr[i] > max_heap[0]:
heapq.heappop(max_heap)
heapq.heappush(max_heap, -arr[i])
return sorted([-x for x in max_heap])
```
其中,heapq库实现了堆排序。
阅读全文