博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求区间第k大的值
阅读量:5982 次
发布时间:2019-06-20

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

#include 
using namespace std;int a[100], n;int part(int l, int r){ if(l > r) return -1; int i=l,j=r; int tmp=a[l]; while(i
=tmp && i
> n; for(int i=0;i
>a[i]; int k; cin>>k; int result = check(0,n-1,k); cout << result; return 0;}

  

只需找到第k大的数,不必把所有的数排好序。我们借助快排中partition过程,一般情况下,在把所有数都排好序前,就可以找到第k大的数。我们依据的逻辑是,经过一次partition后,数组被pivot分成左右两部分:S左、S右。当S左的元素个数|S左|等于k-1时,pivot即是所找的数;当|S左|小于k-1,所找的数位于S右中;当|S左|>k-1,所找的数位于S左中。显然,后两种情况都会使搜索空间缩小。

算法的时间复杂度为:O(N),计算公式,假设我们的数据足够的随机,每次划分都在数据序列的中间位置,根据条件1,那么第一次划分我们需要遍历约n个数,第二次需要遍历约n/2个数,...,这样递归下去,最后:

 

 

快排

#include
using namespace std;int a[100], n;void quick_sort(int l, int r){ if(l > r) return; int i=l, j=r; int tmp=a[l]; while(i
=tmp && i
> n; for(int i = 0; i
>a[i]; quick_sort(0,n-1); for(int i=0; i

  

转载于:https://www.cnblogs.com/ya-cpp/p/9245065.html

你可能感兴趣的文章
我的友情链接
查看>>
DISCUZ官方论坛模仿开发日志(二)
查看>>
Java设计模式系列之策略模式
查看>>
Sql异常①
查看>>
Jquery 校验文本框只能输入负数、小数、整数
查看>>
fanc委托在项目中使用
查看>>
PHP 命名空间
查看>>
层次分析法
查看>>
[转] xgboost
查看>>
ASP.NET一些常用的东西
查看>>
音乐播放类应用后台播放耗电评测报告
查看>>
2015百度之星 单调区间
查看>>
项目经理之什么是项目管理
查看>>
Ubuntu安装Chrome的方法
查看>>
用批处理来操纵你的光驱
查看>>
SQL 问题记录
查看>>
vim修改时自动备份配置文件小脚本
查看>>
我的友情链接
查看>>
官宣:深度剖析免费OA系统是如何盈利
查看>>
vue2.0学习笔记(一)搭建学习环境
查看>>