博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
寻找最小的k个数(四种方法)
阅读量:6964 次
发布时间:2019-06-27

本文共 995 字,大约阅读时间需要 3 分钟。

1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入

void topK(int arr[],int n,int k){    if(k>n)        return;    priority_queue
q; for(int i=0;i

2 使用set的排序功能,以从大到小的顺序排序所有前K个元素,取出其余的元素与第一个元素比较,如果小于第一个元素,则将第一个元素删除,将当前元素插入。

void topK1(int arr[],int n,int k){    set
> st; if(k>n) return; for(int i=0;i
arr[i]) { st.erase(iter); st.insert(arr[i]); } } } auto iter=st.begin(); while(iter!=st.end()) { cout<<*iter++<<' '; } cout<

3 使用partition的方法,每次找出一个数的固定位置index,其中左边的元素都比该元素小,右边的元素都比该元素大。如果index==k-1,则结束循环,找出的index及之前的元素就是k个最小的元素,否则如果index

大于k-1,则需要找的元素在index的左边,否则需要找的元素在index的右边。循环查找直到index==k-1。

int partition(int arr[],int s,int e){    int priov=arr[e];    int i=s-1;    int j=s;    for(;j

4 利用选择排序的功能,n个元素中找出最小值与第一个元素交换,从n-1个元素中找出次小值与第二个元素交换,直到找到k个元素位置。

void topK3(int arr[],int n,int k){    for(int i=0;i

 

转载地址:http://cjzsl.baihongyu.com/

你可能感兴趣的文章
.net微信公众号开发——消息与事件
查看>>
动态网站维护基本命令
查看>>
透视表提取不反复记录(2)-每一个物品的全部分类
查看>>
基于jQuery/CSS3实现拼图效果的相册插件
查看>>
【问题解决】小数点前面不显示0的问题
查看>>
ios学习笔记(二)第一个应用程序--Hello World
查看>>
Maven学习总结(四)——Maven核心概念——转载
查看>>
怎么用CIFilter给图片加上各种各样的滤镜_2
查看>>
android:关于主工程和library project
查看>>
CodeForces 2A Winner
查看>>
Window环境配置Mongodb
查看>>
制作和unity调用动态链接库dll文件
查看>>
exsi6.0远程修改密码
查看>>
Header和Cookie相关内容
查看>>
20个可能你不知道Linux网路工具
查看>>
Android 关于listView 显示不全的问题
查看>>
构造函数创建私有变量(防继承)
查看>>
scrum 开发方式学习笔记
查看>>
Terraform使用案例
查看>>
Mac下brew方式安装mysql
查看>>