题目链接:第k个数

题意:求n个数中第k小的数

题解:

//由快速排序算法演变而来的快速选择算法
#include<iostream>
using namespace std;
const int N=1e5+10; int a[N];
//k是整个区间中的第k小的数。
void quick(int l,int r,int k)
{//快速选择算法保证每次递归时都递归到答案所在的区间.
int i=l-1,j=r+1,x=a[l+r>>1];
if(l>=r)return a[r];
while(i<j)
{
while(a[++i]<x);
while(a[--j]>x);
if(i<j)swap(a[i],a[j]);
} cout<<"i: "<<i<<"j: "<<j<<"x: "<<x<<endl;
quick(l,j);
quick(j+1,r);
}
/*
5
2 3 4 5 1
i: 3j: 2x: 4
i: 2j: 1x: 3
i: 1j: 0x: 2
i: 4j: 3x: 5
1 2 3 4 5
通过一组测试数据发现i+1==x,i-1=j; j是x在数组中的下标
得到数组中比<=x的数有j+1个
扩展问题:求第k大的数 基础问题:求第k小的数
每次统计<=x的数的个数及j+1,如果j+1<=cnt左边去递归
否则右边去递归
*/
int main()
{
int n,k;cin>>n>>k;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
quick(0,n-1,k);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}

代码:

#include<iostream>
using namespace std; const int N=1e6+10; int a[N]; int quick(int l,int r,int k)
{
int i=l-1,j=r+1,x=a[l+r>>1];
if(l>=r)return a[l];
while(i<j)
{
while(a[++i]<x);
while(a[--j]>x);
if(i<j)swap(a[i],a[j]);
}
int sl=j-l+1;
if(sl>=k)
quick(l,j,k);
else
quick(j+1,r,k-sl);
} int main()
{
int n,k;cin>>n>>k;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
cout<<quick(0,n-1,k); }

求第k小的数的更多相关文章

  1. *HDU2852 树状数组(求第K小的数)

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. [LeetCode] 4. Median of Two Sorted Arrays(想法题/求第k小的数)

    传送门 Description There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the m ...

  3. 求第k小的数 O(n)复杂度

    思路:利用快速排序的思想,把数组递归划分成两部分.设划分为x,数组左边是小于等于x,右边大于x.关键在于寻找一个最优的划分,经过 Blum . Floyd . Pratt . Rivest . Tar ...

  4. 基于快速排序思想partition查找第K大的数或者第K小的数。

    快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...

  5. 最快效率求出乱序数组中第k小的数

    题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不 ...

  6. 无序数组求第k大/第k小的数

    根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: ...

  7. 树状数组求第k小的元素

    int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...

  8. [LeetCode] Find K-th Smallest Pair Distance 找第K小的数对儿距离

    Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pai ...

  9. #7 找出数组中第k小的数

    「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...

随机推荐

  1. JavaScript学习系列博客_10_JavaScript中的while语句

    循环语句 - while循环 - 语法: while(条件表达式){ 语句... } - 执行流程: while语句在执行时,会先对条件表达式进行求值判断, 如果判断结果为false,则终止循环 如果 ...

  2. Mybatis_day3

    三 使用XML配置SQL映射器(映射文件) 关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,[MyBatis鼓励]开发者可以直接[使用数据库],而 ...

  3. Spring Boot系列(四):Spring Boot源码解析

    一.自动装配原理 之前博文已经讲过,@SpringBootApplication继承了@EnableAutoConfiguration,该注解导入了AutoConfigurationImport Se ...

  4. 【Eclipse+PyDev】使用Python的IDE安装及配置详解

    转的文章 https://blog.csdn.net/jkwwwwwwwwww/article/details/51338230 https://blog.csdn.net/Jkwwwwwwwwww/ ...

  5. vue混入mixins时注意的问题

    mixin.js - 方式一:导出对象 const mixin = { mounted () { console.log('fffffffffffff') }, methods: { } } expo ...

  6. AQI分析

    A Q I  分 析 1.背景信息 AOI( Air Quality Index),指空气质量指数,用来衡量空气清洁或污染的程度.值越小,表示空气质量越好.近年来,因为环境问题,空气质量也越来越受到人 ...

  7. 关于idea中SpringBoot启动失败的坑

    很多时候你新建了Maven 或者SpringBoot 工程,激动的点了主启动类,你就发现了下面的错误 Error starting Tomcat context. Exception: org.spr ...

  8. 认证授权:IdentityServer4

    前言 上一篇文章<学习OIDC>介绍了OIDC协议,本篇开始我们就来具体来学习OIDC的具体实现IdentityServer4 学习. 一.IdentityServer4 是什么? Ide ...

  9. 跟着兄弟连系统学习Linux-【day06】

    day06-20200603 p21.用户管理命令 [useradd 用户名]添加用户 [passwd  用户名] 设置密码

  10. css3渐变色实现小功能 ------ css(linaer-gradient)

    由沿直线两种或多种颜色之间的渐进转换的图像.它的结果是数据类型的对象,这是一种特殊的类型. 与任何梯度一样,线性梯度没有内在维度 ; 即,它没有天然或优选的尺寸,也没有优选的比例.其具体尺寸将与其适用 ...