对于给定的n个元素的数组a[1..n],要求从中找出第k小的元素。 【输入样例】 a={20, 43, 32, 67 ,48, 89, 36, 47, 15} k=3
时间: 2023-10-09 22:11:31 浏览: 132
一种解法是使用快速排序的思想,选取一个基准元素,将数组分成小于基准元素和大于基准元素两部分,然后判断第k小元素在哪一部分中,再对相应的部分递归进行查找。具体实现可以参考以下代码:
```python
def quick_select(arr, k):
"""
在数组 arr 中找到第 k 小的元素
"""
if len(arr) == 1:
return arr[0]
pivot = arr[0] # 选取第一个元素作为基准元素
left = [x for x in arr[1:] if x < pivot] # 小于基准元素的部分
right = [x for x in arr[1:] if x >= pivot] # 大于等于基准元素的部分
if k <= len(left):
return quick_select(left, k)
elif k == len(left) + 1:
return pivot
else:
return quick_select(right, k - len(left) - 1)
a = [20, 43, 32, 67, 48, 89, 36, 47, 15]
k = 3
print(quick_select(a, k)) # 输出 20
```
另外,还有一种基于堆排序的解法,可以维护一个大小为k的小根堆,然后遍历数组,将元素依次加入堆中,当堆的大小超过k时,就弹出堆顶元素,保证堆中始终保留最小的k个元素,最终堆顶元素即为第k小元素。具体实现可以参考以下代码:
```python
import heapq
def kth_smallest(arr, k):
"""
在数组 arr 中找到第 k 小的元素
"""
heap = []
for x in arr:
heapq.heappush(heap, x)
if len(heap) > k:
heapq.heappop(heap)
return heap[0]
a = [20, 43, 32, 67, 48, 89, 36, 47, 15]
k = 3
print(kth_smallest(a, k)) # 输出 20
```
阅读全文