一  问题描述:

找出 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  --完成了最后一步

          

       

       

       

最新文章

  1. Asp.Net跨平台:Ubuntu14.0+Mono+Jexus+Asp.Net
  2. spring 配置 redis
  3. 【转】输入/输出流 - 深入理解Java中的流 (Stream)
  4. Unity3d优化
  5. ListView实现Item局部刷新
  6. 制作ubuntu安装u盘
  7. &lt;老友记&gt;学习笔记
  8. linux下的clock skew detected
  9. Asp.net动态调用WebService
  10. 使用css3画饼图
  11. 【Linux】鸟哥的Linux私房菜基础学习篇整理(五)
  12. Sandcastle Help File Builder使用教程
  13. Vim命令快捷键(网摘)
  14. 函数的作用域与this指向 --- 性能篇
  15. DB 查询分析器 6.04 在 Windows 10 上的安装与运行展示
  16. 导出pip安装的所有放入一个文件中,并把通过这个安装所有的包
  17. Spring中的AOP 专题
  18. 如何取得select结果数据集的前10条记录。postgresql
  19. Chart-template
  20. 日志log4cxx 封装、实例讲解、配置文件log4cxx.properties

热门文章

  1. iso学习网站记录
  2. Android应用连接代理服务器状况监测解决
  3. Eclipse C/C++环境配置
  4. 通过例子学python(2.2)
  5. poj 3159 Candies
  6. hdoj 1969 Pie【二分】
  7. 未能导入activex控件,请确保它正确注册
  8. ELK初学搭建(logstash)
  9. JS方法在iframe父子窗口间的调用
  10. Web App和Native App 谁将是未来