题目链接:第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. Hyperledger Fabric【区块链学习一】

    Hyperledger Fabric 学习 什么是区块链 什么是区块链在我们没有接触的时候,只知道它是一个去中心化的存储方式.当我们发生交易,或者动作的时候我们会将记录通知给所有参与者共同维护,达到去 ...

  2. Docker 架构及工作原理

    通过下图可以得知,Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互. ...

  3. springMVC入门(一)------springMVC基本概念与安装

    springMVC简介 springMVC是一个基于MVC的web框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. springMVC安装 本例中使用 ...

  4. git 生成并添加 SSH key

    git config --global user.name "wangjunqiang" git config --global user.email "wangjunq ...

  5. K8s 1.18.6版本基于 ingress-nginx 实现金丝雀发布(灰度发布)

    K8s 1.18.6版本基于 ingress-nginx 实现金丝雀发布(灰度发布) 环境 软件 版本 kubernetes v1.18.6 nginx-ingress-controller 0.32 ...

  6. 第7篇scrum冲刺(5.27)

    一.站立会议 1.照片 2.工作安排 成员 昨天已完成的工作 今天的工作安排 困难 陈芝敏  学习云开发,云函数调用以及数据的前后端传递  今天实现云词库搭建,随机获取并显示,对云开发有更深的认识   ...

  7. pandas外部数据的读取构造数据框-文本文件读取(一种utf-8中文编码乱码处理经验)

    上面一篇文章有记录pandas构造数据框的方式有二维数组,字典,嵌套的列表和元组等,本篇用于介绍通过外部数据读取的方式来构造数据框. python读取外部数据集的时候,这些数据集可能包含在文本文件(c ...

  8. 区块链入门到实战(36)之Solidity – 运算符

    Solidity – 算术运算符 Solidity 支持的算术运算符,如下表所示: 假设变量A的值为10,变量B的值为20. 序号 运算符与描述 1 + (加)求和例: A + B = 30 2 – ...

  9. C#中WebService的创建、部署和调用的简单实例

    webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子. 一:WebService的创建开发 先新建一 ...

  10. Linux下如何知道是否有人在使坏?

    在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...