根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html

博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现。

解法3: 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
           1.
Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
           2.
Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

#include<stdio.h>
#include<string.h>
int par(int a[],int l,int r){
int x=a[l];
while(l<r){
while(l<r&&a[r]<=x) --r;
a[l]=a[r];
while(l<r&&a[l]>=x) ++l;
a[r]=a[l];
}
a[l]=x;
return l;
}
int search(int a[],int l,int r,int k){
if(l<=r){
int p = par(a,l,r);
if(p-l+==k) return p;
else if(p-l+<k){
return search(a,p+,r,k-(p-l+));
}else{
return search(a,l,p-,k);
}
}
}
int main(){
int n,k;
int a[];
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
printf("%d\n",a[search(a,,n,k)]);
return ;
}

解法6:维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中。时间复杂度O(n * logk)

注意:这里要求第k大的数,所以要构建的是小顶堆,并且只有当新进来的数大于堆顶也就是目前k个数里最小的数时,才有可能是第k个大的数,才将其加入堆。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
void heapAdd(int a[],int i,int num){
a[i]=num;
for(int j=i>>;j&&i&&a[i]<a[j];i=j,j>>=)
swap(a[i],a[j]);
}
void heapDown(int a[],int i,int n){
for(int j=i<<;j<=n;i=j,j<<=){
if(j+<=n&&a[j+]<a[j]) j++;
if(a[i]>a[j]) swap(a[i],a[j]);
}
}
int a[],n,k,b[];
int main(){
scanf("%d%d",&n,&k);
int cnt=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(cnt<k){
heapAdd(b,++cnt,a[i]);
}else{
if(b[]<a[i]){
b[]=a[i];
heapDown(b,,k);
}
}
}
printf("%d\n",b[]);
return ;
}

如果要求的是第k小的数,则把相应的判断条件改一下就可以了

无序数组求第k大/第k小的数的更多相关文章

  1. 无序数组求第K大的数

    问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...

  2. 求一无序数组中第n大的数字 - 快速选择算法

    逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) #include <v ...

  3. 无序数组中第Kth大的数

    题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45. 输入: 第一行输入无序数组,第二行输入K值. 该是内推滴滴打车时(2017.8.26)的第二题,也是<剑指of ...

  4. 从长度为 M 的无序数组中,找出N个最小的数

    从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...

  5. uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1

    Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...

  6. 数据结构2 静态区间第K大/第K小

    给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...

  7. 1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】

    题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比 ...

  8. Ping pong(树状数组求序列中比某个位置上的数小的数字个数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Time Limit: 2000/1000 MS (Java/Others) ...

  9. hdu5057 分块处理,当数值大于数据范围时树状数组 真是巧 将大数据分为小数据来处理

    这题说的给了100000个数有100000次操作 询问 L和R 区间内 在D位上为P的个数,用树状数组存 要开[10][10][100000]的int 开不了但是能开 这么大的unsign short ...

随机推荐

  1. return的作用

    (1)终止函数的执行. (2)返回到调用的地方. (3)返回值.

  2. 【自动化测试】robot framwork的一点小发现

    我们在搭建完robotframwork框架并开始打开火狐浏览器的时候,总会碰到打不开浏览器的问题.这次,分享一个常见的小问题. 这个问题呢,是因为火狐的版本更新频繁,导致selenium的版本跟不上导 ...

  3. 运用JS判断代码可以参考学习

    JAVAScript代码加CSS和HTML <%-- Created by IntelliJ IDEA. User: zengxiangcai Date: 2018/6/27 Time: 11: ...

  4. 马昕璐 201771010118《面向对象程序设计(java)》第六周学习总结

    第一部分:理论知识学习部分 1.继承 继承:用已有类来构建新类的一种机制.当定义了一个新类继承了一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的情况. 继承是Java ...

  5. Java课后作业之石家庄地铁系统PSP表格20190403

    PSP2.1 Personal Software Process Stages Time Planning 计划 36 hours · Estimate · 估计这个任务需要多少时间 36 hours ...

  6. ajax 传递中文字符参数 问题

    使用ajax 传递中文字符串时, 服务端会接收不到预期的 中文字符. 此时,需要对 js中的中文字符参数进行 编码,  到达服务端后, 再为其解码 即可. 前端: var url = '....'; ...

  7. vue全选与取消全选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. page0902未完成

    /** * @author:(LiberHome) * @date:Created in 2019/3/1 23:14 * @description: * @version:$ */ import j ...

  9. nodejs----安装配置

    Node.js 安装配置 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 你可以根据不同平台系统选择你需要的 Node.js 安装包. Nod ...

  10. js取整数、取余数

    js取整数.取余数 取整 1.取整 // 丢弃小数部分,保留整数部分 parseInt(5/2) // 2 2.向上取整 // 向上取整,有小数就整数部分加1 Math.ceil(5/2) // 3 ...