求数组中第K大的数可以基于快排序思想,步骤如下:

1、随机选择一个支点

2、将比支点大的数,放到数组左边;将比支点小的数放到数组右边;将支点放到中间(属于左部分)

3、设左部分的长度为L,

当K < L时,递归地在左部分找第K大的数

当K > L时,递归地在有部分中找第(K - L)大的数

当K = L时,返回左右两部分的分割点(即原来的支点),就是要求的第K大的数

以上思想的代码实现如下:

/**
线性时间复杂度求数组中第K大数
** author :liuzhiwei
** data   :2011-08-07
**/
#include "iostream"
using namespace std;
//基于快速排序思想,求数组a中第k大的数,low和high分别为数组的起始和结束位置
//时间复杂度为o(n),n为数组的长度
//1<=k<=n
//如果存在,返回第k大数的下标,否则返回-1
int selectk(int a[], int low, int high, int k)
{
if(k <= 0)
return -1;
if(k > high - low + 1)
return -1;
int pivot = low + rand()%(high - low + 1);    //随即选择一个支点
swap(a[low], a[pivot]);
int m = low;
int count = 1;
//一趟遍历,把较大的数放到数组的左边
for(int i = low + 1; i <= high; ++i)
{
if(a[i] > a[low])
{
swap(a[++m], a[i]);
count++;              //比支点大的数的个数为count-1
}
}
swap(a[m], a[low]);           //将支点放在左、右两部分的分界处
if(count > k)
{
return selectk(a, low, m - 1, k);
}
else if( count < k)
{
return selectk(a, m + 1, high, k - count);
}
else
{
return m;
}
}
int main(void)
{
int a[] = {5, 15, 5, 7, 9, 17,100, 3, 12, 10, 19, 18, 16, 10, 1000,1,1,1,1,1,1,1,1};
int r = selectk(a, 0, sizeof(a) /sizeof(int) - 1, 5);
cout<<(r == -1 ? r : a[r])<<endl;
system("pause");
return 0;
}

稍微改动一下,就可以修改为求数组中第K小数
         完整的代码如下:

/**
线性时间复杂度求数组中第K小数
** author :liuzhiwei
** data   :2011-08-07
**/
#include "iostream"
using namespace std;
//基于快速排序思想,求数组a中第k小的数,low和high分别为数组的起始和结束位置
//时间复杂度为o(n),n为数组的长度
//1<=k<=n
//如果存在,返回第k小数的下标,否则返回-1
int selectk(int a[], int low, int high, int k)
{
if(k <= 0)
return -1;
if(k > high - low + 1)
return -1;
int pivot = low + rand()%(high - low + 1);    //随即选择一个支点
swap(a[low], a[pivot]);
int m = low;
int count = 1;
//一趟遍历,把较小的数放到数组的左边
for(int i = low + 1; i <= high; ++i)
{
if(a[i]<a[low])
{
swap(a[++m], a[i]);
count++;              //比支点小的数的个数为count-1
}
}
swap(a[m], a[low]);           //将支点放在左、右两部分的分界处
if(k < count)
{
return selectk(a, low, m - 1, k);
}
else if( k > count)
{
return selectk(a, m + 1, high, k - count);
}
else
{
return m;
}
}
int main(void)
{
int a[] = {5, 15, 5, 7, 9, 17,100, 3, 12, 10, 19, 18, 16, 10, 1000,1,1,1,1,1,1,1,1};
int r = selectk(a, 0, sizeof(a) /sizeof(int) - 1, 23);
cout<<(r == -1 ? r : a[r])<<endl;
system("pause");
return 0;
}

线性时间复杂度求数组中第K大数相关推荐

  1. 求数组中第k个最小数

    一.问题描述 给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,例如对于数组x,x = {3,2,1,4,5,6},则其第2个最小的数为2. 二.解题思路 本算法跟快排的思想相似,首先 ...

  2. 怎么修改数组中指定元素_求数组中第K大的元素

    问题描述 求无序数组int[] nums中第K大的元素. 例如 输入:nums[] = {9,5,8},k = 2 输出:8 输入:nums[] = {3,1,2,4,5,5,6},k = 4 输出: ...

  3. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  4. 求数组中k个数的所有组合

    /*** 求数组中 k个元素序列 的所有组合* @param start* @param array* @param length* @param k* @param list* @param use ...

  5. 算法12--topK求一个数组中第k大的数

    求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...

  6. 求数组中最长递增子序列的长度

    题目:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例:在序列[1, -1, 2, -3, 4, -5, 6, -7]中,其最长递增子序列的长度为4([1, 2, ...

  7. java求数组中满足给定和的数对_关于数组的几道面试题 - zdd - 博客园

    2011年2月15日更新,加入找出绝对值最小的元素一题 数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考,如果您有更好的题目或者想法,欢迎留言讨论.目前有以下1 ...

  8. 寻找无序数组中第k大的数

    对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法. 1.直接排序法 使用常见的归并排序.堆排序等算法对数组进行排序,然后找到第k大的数.排序算法的时间复杂度为O(nlogn),所以算法总 ...

  9. C++求数组中的逆序对

    C++求数组中的逆序对. 如果在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 #include<iostream> ...

最新文章

  1. [Java基础]让Map value自增
  2. 微信小程序上传图片时provisional headers are shown显示我的错误解决方案
  3. Linux_unix系统编程手册以同步方式等待信号
  4. 【机器学习】主题模型
  5. 图像模糊处理(信息学奥赛一本通-T1128)
  6. 标准日本语 05_003
  7. Github排序(转载)
  8. VC实现将程序最小化到托盘
  9. Oracle Concepts Guide 中 Oracle 实例 和 数据库 【关系图】
  10. Java获取姓名的首字母_java获取中文拼音首字母的实例
  11. hashmap java 排序_Java HashMap 默认排序
  12. *明确插件的功效*千千静听听音效插件使用介绍及相关下载
  13. 「数据运营」理解DataOps运营
  14. matlab 精品课程,同济大学经济与管理学院精品课程
  15. python——列表基础操作
  16. 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
  17. java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc
  18. App研发录:架构设计、Crash分析和竞品技术分析读书笔记
  19. js如何删除数组的倒数第n个及后面元素
  20. html 定义悬浮块层级,采用CSS3的动态元素(动画)设计div块的层级式展现

热门文章

  1. 1808: FJ的字符串
  2. Hologres揭秘:高性能原生加速MaxCompute核心原理
  3. 配置审计(Config)配合开启OSS防盗链功能
  4. 命令行工具开发:如何快速实现命令行提示?
  5. 结合传统与数字技术,构建逼真的机械设计
  6. Unity TA总监王靖:Unity如何实现美术画质升级?
  7. php socket(服务端与客户端)demo
  8. PHP面试题:合并两个数组有几种方式,试比较它们的异同
  9. Linux RH5平台下使用Oracle ASM创建数据库
  10. day24-1 元类