博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无序整数数组中找第k大的数
阅读量:6799 次
发布时间:2019-06-26

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

方法一:基于快排

1 /* 2 基于区间快排的第K小算法 ,输出a[k-1]即可,O(n*logn);每次只对后半部分递归便可把复杂度降到O(n)  3 主要思路是每次随机在数组中选取一个元素p,利用这个元素将数组分成两部分,比p小的元素在分好的数组左边,p和比p大的元素在数组右边, 4 根据k值选择在数组左半或者右半部分继续递归执行查找。 5 */ 6 #include 
7 #include
8 #include
9 #include
10 using namespace std;11 12 void swap(int *p, int *q)13 {14 int t;15 t = *p;16 *p = *q;17 *q = t;18 }19 20 int findNumberK(vector
&vec, int k, int from, int to)21 {22 int roll = vec[from], middle = 0, j = from;//roll是指标杆值 23 for(int i = from+1 ; i<= to ; i++)24 {25 if(vec[i] < roll)26 {27 j++;//roll左边每次被换的元素 的下标 28 swap(&vec[i], &vec[j]);29 middle++;30 }31 }32 swap(&vec[from], &vec[j]);33 if(middle == k -1 )34 return roll;35 else if (middle < k - 1)36 {37 return findNumberK(vec, k - middle - 1, j + 1, to);38 }39 else40 return findNumberK(vec, k, from, j - 1);41 }42 43 int main()44 {45 vector
vec;46 int temp, k;47 48 cout << "input data(以0结束):" << endl;49 cin >> temp;50 51 while(temp != 0)52 {53 vec.push_back(temp);54 cin >> temp;55 }56 57 cout << "input K: " << endl;58 59 cin >> k;60 61 int re = findNumberK(vec , k, 0 ,vec.size() - 1);62 63 cout << "Test Result: " << re << endl;64 65 sort(vec.begin(), vec.end(), less
());66 67 cout << "real Result: " << vec[k-1] << endl;68 //while(1);69 return 0;70 }

 

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

你可能感兴趣的文章
初识权限
查看>>
括号配对问题 栈(stack)的利用
查看>>
eas之载入编辑界面时设置明细默认值createNewDate()
查看>>
关于师生关系博客最理想的师生关系是健身教练和学员的关系,在这种师生关系中我期望在老师那里收获的东西...
查看>>
C++八大金刚
查看>>
实例学习SQL的Select命令
查看>>
mui switch 开关js控制打开 & Cannot read property 'toggle' of null
查看>>
在构造函数/析构函数中能否调用虚函数?
查看>>
如何配置php客户端(phpredis)并连接Redis--华为DCS for Redis使用经验系列
查看>>
前苹果副总裁:如果你做的事情毫不费力,就是在浪费时间
查看>>
排序算法之归并排序
查看>>
作为程序员应该注意的规范和经验
查看>>
json官方学习档案
查看>>
设置笔记本内网和外网同时使用
查看>>
设置span在div中垂直居中
查看>>
hbase源码系列(三)Client如何找到正确的Region Server
查看>>
开源MongoDB管理工具MongoCola1.20 发布 离开IBM GDC的最后一个版本
查看>>
从ASP.NET 升级到ASP.NET5(RC1) - 翻译
查看>>
PHP:数组中的引号问题
查看>>
CSS3:RGBA的使用方法
查看>>