求无需序列中第k小的元素(优先队列)

求无需序列中第k小的元素

一、【问题描述】

编写一个实验程序,利用priority_queue(优先队列)求粗一个无序整数序列中第k小的元素

二、【问题解答】

分析:
创建一个priority_queue<int,vector<int>,greater<int>>的小根堆pq,将数组a中的所有元素进队,再连续出队,第k个出队元素即为所求。

对应代码如下:

#include<stdio.h>
#include<queue>
using namespace std;
int thk(int a[],int n,int k){
	int i,j;
	priority_queue<int,vector<int>,greater<int> > pq;
	for(i=0;i<n;i++){
		pq.push(a[i]);
	}
	for(i=1;i<=k;i++){
		j=pq.top();
		pq.pop();
	}
	return j;
} 
int main(){
	int a[]={9,5,0,13,4,6,7,2};
	int n=sizeof(a)/sizeof(a[0]);
	for(int k=1;k<=n;k++){
		printf("第%d小的元素:%d\n",k,thk(a,n,k));
	}
	return 0;
}
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用快速选择算法(QuickSelect)来解决这个问题。 快速选择算法的基本思路是,选择一个元素作为“pivot”,然后根据它将序列分成两部分,一部分比它小,一部分比它大。如果pivot的位置恰好是k-1,那么这个元素就是第k小的数;否则,如果pivot的位置比k-1小,那么第k小的数一定在右半部分;如果pivot的位置比k-1大,那么第k小的数一定在左半部分。然后递归地在左或右部分继续查找,直到找到第k小的数为止。 快速选择算法的时间复杂度是O(n),与快速排序算法类似,但是它只需要处理一半的数据,因此平均情况下它的性能要比快速排序好。 下面是一个使用快速选择算法解第k小元素的Python代码: ```python import random def quick_select(nums, k): pivot = random.choice(nums) left = [n for n in nums if n < pivot] right = [n for n in nums if n > pivot] mid = [n for n in nums if n == pivot] if k <= len(left): return quick_select(left, k) elif k <= len(left) + len(mid): return pivot else: return quick_select(right, k - len(left) - len(mid)) n = int(input()) nums = list(map(int, input().split())) k = int(input()) print(quick_select(nums, k)) ``` 其,random.choice(nums) 表示从序列 nums 随机选择一个元素作为pivot。left、right、mid 分别表示小于、大于、等于pivot的元素集合。在递归过程,如果k<=len(left),则说明第k小的数在左半部分;如果k<=len(left)+len(mid),则说明pivot就是第k小的数;否则,第k小的数在右半部分,需要递归查找右半部分的第k-len(left)-len(mid)小的数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值