问题:有一个大小为n的数组A[0,1,2,…,n-1],求其中第k大的数。
该问题是一个经典的问题,在《算法导论》中被作为单独的一节提出,而且其解决方法很好的利用了分治的思想,将时间复杂度控制在了O(n),这多少出乎我们的意料,此处暂且不表。
该问题还可以变形为:有一个大小为 n的数组A[0,1,2,…,n-1],求其中前k大的数。
一字之差,原问题是“第k大”,变形的问题是“前k大”,但是平均时间复杂度却都可以控制在O(n),这不由得让人暗暗称奇。
我们先分析原问题:有一个大小为 n的数组A[0,1,2,…,n-1],求其中第k大的数。
我们先取特例,令k=1,那么就是取最大的数,只要扫描一遍数组就可以确定该值,如果k=2,则扫描两边数组就可以确定第二大的数,依此类推下去,时间复杂度是O(k*n),如果k跟n是一个数量级,那么时间复杂度就是O(n*n)了,显然不是最优的解法。
考虑分治法,难点在于如何将该问题分解为两个子问题。
快速排序最基础的一步:
随机取某一个数x,将其与数组末尾元素交换,然后将比其小的数交换至前,比其大的数交换至后。
这一步使某一数组的快速排序问题分解成两个子数组的排序问题,现在我们就依此来解决取第k大的数这个问题。
设数组下表从0开始,至n-1结束。
1、 随机取某个数,将其与数组末尾元素交换。
a) idx=rand(0,n-1);生成[0,n-1]间的随机数。
b) Swap(array[idx], array[n-1]);
2、 用末尾元素x,将比x小的数交换至前,比x大的数交换至后,并返回此时x在数组中的位置mid。
3、 如果mid==n-k,那么返回该值,这就是第k大的数。
如果mid>n-k,那么第k大的数在左半数组,且在左半数组中是第k-(n-mid)大的数。
如果mid<n-k,那么第k大的数在右半数组,而且仍然是第k的数。
复制代码 代码如下:
#include "iostream"
using namespace std;
int random_partion(int *p, int n)
{
int idx=rand()%n;
swap(p[idx], p[n-1]);
int i=-1; //i表示最后一个小于p[n-1]的元素的位置
int j=0; //j用来扫描数组
for(j=0; j<n; j++)
{
//将小于p[n-1]的数交换到前半部分
if(p[j]<p[n-1])
{
swap(p[++i], p[j]);
}
}
swap(p[++i], p[n-1]);
return i;
}
int getMaxK(int *p, int n, int k)
{
int mid;
if(k<=0)
return -1;
if(n<k)
return -1;
mid=random_partion(p, n); //对原数组进行一次划分
if(mid == n-k) //如果mid==n-k,那么返回该值,这就是第k大的数
return p[mid];
else if(mid<n-k)
return getMaxK(p+mid+1, n-mid-1, k); //如果mid<n-k,那么第k大的数在右半数组,而且仍然是第k大数
else
return getMaxK(p, mid, k-(n-mid)); //如果mid>n-k,那么第k大的数在左半数组,且在左半数组中是第k-(n-mid)大的数
}
int main(void)
{
int num,a[] = {12012, 3, 945, 965, 66, 232, 65, 7, 8, 898, 56, 878, 170, 13, 5};
num=getMaxK(a, 15, 4);
printf("%d\n",num);
system("pause");
return 0;
}
相关推荐:
SEO包月服务:助力企业提升网站排名与流量的长期利器,网站建设流程 报读文库
智能AI写作生成:如何借助人工智能提升创作效率与质量
SEO笔记:如何打造高效的SEO策略提升网站排名,网站优化优质服务方案
一秒采集:提升效率、创造价值的秘密武器,苏州网站整站优化
实用AI工具:提升效率、优化生活的科技利器
亚马逊中什么是seo,亚马逊sop ,ai临摹中国名画
未来写作新方式原创AI文章的无限可能
seo词库优化,搜索词条优化 ,ai点选择
SEO运营工作是什么,seo公司运营 ,720516AI
怎么识别是AI写的文章
SEO软优化:助力网站实现流量爆发的秘密武器,延平区网页seo
为什么说seo这么重要,seo重要吗 ,ai19920403
ChatGPT翻译打不开?解决方法!,ai爱股票
SEO引擎优化方法-让你的网站流量暴增的实战指南,ai智慧树
ChatGPTWindows版本下载:让AI助力您的工作和生活,ai yamama
如何利用AI生成高质量文章,提升写作效率与创意?
AI免费写作一键生成,效率与创意的完美结合
SEO到底怎么做?揭秘从零到精通的完整SEO优化攻略,鸟瞰ai
SEO武汉:如何提升武汉地区网站的搜索引擎排名,景区网站建设费用
AI生成网页模板,轻松打造专业网站,ai网格画法
ChatGPT画布打不开?如何解决这一常见问题?,Ai怎么储存为Ai格式在桌面
云推SEO:让您的网站在激烈竞争中脱颖而出,网站优化公司欢迎来电
AI写作免费一键生成下载,助您轻松创作!
什么是seo艺术,什么是seo seo有何价值 ,ai写作生成器 推荐
文章创作AI:引领智能写作的新时代
什么是秀米?全方位了解这款微信公众号排版神器,宁波全网营销型网站建设
SEO职位:数字营销的核心,开启职业新高峰,汕尾网站建设推广厂商
ChatGPT3.5需要登录使用吗?AI使用的真相!,电脑版写作ai推荐怎么关闭
优化高效率:提升个人与企业竞争力的关键,安康网站推广咨询
seo用什么法宝,列出5种seo赚钱方式 ,ai怎么更改文档样式
什么是seo反连接,网站反链多好还是少好 ,网易ai产品
seo网站关键字排名优化,网站seo关键词 ,运动ai
什么是“神马关键词”?如何用它提升你的网络营销效果?,新闻发布网站怎么做推广
SEO优化10种策略:提升网站排名的有效方法,帅气ai男头白底
SEO公司核心业务是什么?揭秘提升网站排名的奥秘,写作助手ai一键生成作文在线
ChatGPT坏了用什么?替代方案,满足你的智能对话需求,星际一的ai
如何识别文章是否由AI撰写?揭开智能写作的秘密
ChatGPT充值打不开?这几招教你轻松解决问题!,免费的ai写作绘图
什么是seo运营,什么是seo营销 ,ai绘画沙地
AI网页设计生成-智能化创造无限可能,ai机甲风背景音乐
seo渠道优化是什么,seo渠道推广怎么做 ,ai121333
产品seo什么意思,产品seo标题是什么 ,ai模仿张宇
什么是seo技术,什么是seo及seo的作用 ,AI倒放仓鼠
什么是seo网站推广,什么是seo网站推广 ,ai酷男人
ChatGPT桌面版无法加载?快速解决方案及常见问题解析,ai媚眼
SEO针对中小企业的增长潜力:如何通过精准优化抢占市场先机,网络推广和营销就选y火10星评价
seo需要了解什么,seo需要学些什么内容 ,ovo ai
SEO获取流量的必杀技:如何通过优化轻松提升网站排名,德州全网营销推广价格
SEO教你如何快速提升网站排名,打破竞争壁垒!,本溪seo优化排名公司
SEO搜索关键词是什么意思?让你轻松网站流量的秘密!,ai颜色不对