一  问题描述:

找出 m 个整数中第 k(0<k<m+1)大的整数。


二  举例:

假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2, -9],请找出第 5 大的数(容易知道是0)。


三   算法思路:

       一种基于快排思想的算法可以在 O(n) 复杂度内找到第k大的数,首先要知道 partition 这个函数,它可以调整一个序列

使小于 key 的元素都排在 key 左边,大于 key 的元素都排在 key 右边,key 可以在这个序列中任意选择,一般选择给定序

列的首元素。

partition函数的一般形式:

 int  partition (int * data, int low, int high)

       其中 low 和 high 分别是给定下标的上下边界。

先举例说明,调用 partition (data,  1,  8),就是要将 data 中从 data[1] 到 data[8] 之间的序列分为两部分

       截取的序列:data[2] -- data[8],为  4, -1, -4, 9, 8, 0, 3, -8

       key 选取第一个数:  key = 4 

       调用 partition(data,  2,  8) 后,这个序列变为: -8, -1, -4, 3, 0,      4,      8, 9

       需要注意的是,data[1] 到 data[8] 这个序列片段在原来 data[0] 到 data[11] 这个大序列中已经发生改变,而其他

       没有截取到的片段保持不变。

      

       partition 的算法步骤如下:

       1     设置两个下标left和right,left = low,right = high

              此时left指向4,也是key元素,right指向-8

               4, -1, -4, 9, 8, 0, 3, -8

       2    从right开始寻找一个小于key的数,它是-8,找到后将它赋值给left所在位置

              4, -1, -4, 9, 8, 0, 3, -8    --找到是-8

              -8, -1, -4, 9, 8, 0, 3, -8   --赋值到4的位置,

              注意key元素4在这些步骤之前就已经保存

       3     从left开始寻找一个比key大的元素,它是9,把它赋值给right所在位置

               -8, -1, -4, 9, 8, 0, 3, -8   --找到是9

               -8, -1, -4, 9, 8, 0, 3, 9   --赋值到-8的位置

             重复步骤2,再次从right开始寻找一个小于key的数,它是3,将它赋值给left所在位置     

                -8, -1, -4, 9, 8, 0, 3,  9   --找到是3

                -8, -1, -4, 3, 8, 0, 3,  9   --赋值到9的位置

             重复步骤3,再次从left开始寻找一个大于key的数,它是8,将它赋值到right指向的位置          

               -8, -1, -4, 3, 8, 0, 3,  9   --找到是8

               -8, -1, -4, 3, 8, 0, 8,  9   --赋值到3的位置

            重复步骤2,再次从right开始寻找一个小于key的数,它是0,将它赋值给left所在位置   

             -8, -1, -4, 3, 8, 0, 8,  9   --找到是0

             -8, -1, -4, 3, 0, 0, 8,  9   --赋值8的位置

           重复步骤3,再次从left开始寻找一个大于key的数,现在left指向0,left++后,会发现left == right,

            所以现在要退出循环,并把key元素赋值为left所在位置       

-8, -1, -4, 3, 0, 4, 8,  9  --完成了最后一步

          

       

       

       

找出整数中第k大的数的更多相关文章

  1. 前端算法题:找出数组中第k大的数字出现多少次

    题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...

  2. 算法题之找出数组里第K大的数

    问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...

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

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

  4. 215. Kth Largest Element in an Array找出数组中第k大的值

    堆排序做的,没有全部排序,找到第k个就结束 public int findKthLargest(int[] nums, int k) { int num = 0; if (nums.length &l ...

  5. 寻找数列中第k大的数算法分析

    问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...

  6. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  7. 查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  8. 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数

    找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...

  9. 求数列中第K大的数

    原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...

随机推荐

  1. Java基础之String,StringBuilder,StringBuffer

    在创建字符串的时候总是习惯性的使用String str = "...";,str = str+"abcd";也有听说过StringBuffer,StringBu ...

  2. 从 3 个 IT 公司里学到的 57 条经验

    自1999年起我就开始发掘一些科技公司,并帮助它们运营.下面是从干这行中得到的57条经验.我可以列出更多,但恐怕会令你厌烦. 1.做你个人有热情的事情.你是你自己最好的民意代表. 2.用户体验很重要. ...

  3. 《University Calculus》-chape4-极坐标与圆锥曲线-极坐标系下的面积与弧长

    极坐标系下的面积: 在直角坐标系下一样,这里在极坐标系下,我们面临一个同样的问题:如何求解一个曲线围成的面积?虽然两种情况本质上是一样的,但是还是存在一些细小的区别. 在直角坐标系下中,我们是讨论一条 ...

  4. span元素之间的间距

    去除inline-block元素间间距的N种方法- zhangxinxu http://www.zhangxinxu.com/wordpress/2012/04/inline-block-space- ...

  5. jQuery之DOM

    jQuery之DOM 1.jQuery属性. 获取元素属性的语法: attr(name)                   例子:$("#img1").attr("sr ...

  6. Adobe Dreamweaver CS6安装步骤

    dreamweaver cs6 下载地址: http://bbs.phonegap100.com/thread-135-1-1.html dreamweaver cs6 是世界顶级软件厂商adobe推 ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...

  8. 在hibernate中使用SQL语句

  9. Qt 学习之路:线程总结

    前面我们已经详细介绍过有关线程的一些值得注意的事项.现在我们开始对线程做一些总结. 有关线程,你可以做的是: 在QThread子类添加信号.这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送 ...

  10. Objective-C中的@Property详解

    Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...