博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求无序数组中第二大的数--快速选择
阅读量:4654 次
发布时间:2019-06-09

本文共 1002 字,大约阅读时间需要 3 分钟。

           之前去面试遇到了这个问题,题目:找出无序数组中第二大的数字。

      定睛一看,好简单,一次遍历就可以找出第二大的数字,不过,这样写没有什么特别之处,因为实在是太简单了。自己仔细想想起了之前做过的题,看看有没有什么类似的。于是,想起了之前在网上看到的一道面试题:找出无序数组中最小的k个数。 要找出最小的k个数,可以用快速选择算法,只要在快速排序之后,枢纽刚好是第k+1个数,那么,他左边的数,刚好就是最小的k个数。要找出无序数组中第二大的数字,可以这样转换:

       0)假设数组中有n个元素,a1~an,而我们要求第k大的数字,就相当于求排序后的第m = n - k + 1个数字。

       1)假设一次快速排序之后,如果枢纽的是第x个(1~n)。

       2)如果x = m,则这个枢纽ax就是我们要求的第k大的数字,结束;如果x < m,则对a0 ~ ax-1进行一次快速排序,重复第2)步;如果x > m,则对ax+1 ~ an 进行一次快速排序,重复第2)步。

                  快速选择的代码如下:

 

//a[] - 要排序的数组//b - 要排序的子区间的开始索引//e - 要排序的子区间的结束索引//k - 求出排序后第k个数int quickselect(int a[], int b, int e, int k){  int i = b ;  int j = e + 1;  int x = a[i];  while(true){    while(a[++i] < x && i < j);    while(a[--j] > x);    if(i >= j)      break;    else      swap(a[i], a[j]);  }  a[b] = a[j];  a[j] = x;  if(k - 1 == j)    return a[j];  else if(k - 1 > j)    return quickselect(a, j + 1, e, k);  else    return quickselect(a, b, j - 1, k);}
                   
总结:快速选择可以用于这类面试题:

       1)求出无序数组中第k大的数

       2)求出无序数组中最大/小的k个数

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/Rex7/p/4752567.html

你可能感兴趣的文章
ES6深入学习记录(一)class方法相关
查看>>
C语言对mysql数据库的操作
查看>>
INNO SETUP 获得命令行参数
查看>>
HTML5与CSS3权威指南之CSS3学习记录
查看>>
docker安装部署
查看>>
AVL树、splay树(伸展树)和红黑树比较
查看>>
多媒体音量条显示异常跳动
查看>>
运算符及题目(2017.1.8)
查看>>
React接入Sentry.js
查看>>
ssh自动分发密匙脚本样板
查看>>
转 小辉_Ray CORS(跨域资源共享)
查看>>
Linux安装postgresql
查看>>
MyBatis启动:MapperStatement创建
查看>>
【 全干货 】5 分钟带你看懂 Docker !
查看>>
[转]优化Flash性能
查看>>
popStar手机游戏机机对战程序
查看>>
lambda表达式树
查看>>
二次注入原理及防御
查看>>
会话记住已登录功能
查看>>
Linux内核分析——可执行程序的装载
查看>>