SELECT算法利用快排中的partition思想来进行无序数组的快速选择。

寻找第i个顺序统计量可以简单理解为寻找第i小的元素。

该算法通过为partition选择一个好的主元,来保证Partition得到一个好的划分。

当然partition需要进行一些修改,把划分的主元也作为输入参数。

代码如下:(仅供参考)

 void InsertionSort(int * const begin, int * const end) {
int i, j, key;
for (i = ; i < begin - end; ++i) {
key = *(begin + i);
for (j = i - ; j >= && (*(begin + j) > key); --j) {
*(begin + j + ) = *(begin + j);
}
*(begin + j + ) = key;
}
}
int Partition(int * const begin, int * const end, int x) {
int i = -;
for (int j = ; j < (end - begin); ++j) {
if (*(begin + j) < x) {
++i;
swap(*(begin + i), *(begin + j));
}
else if (*(begin + j) == x && j != (end - begin - )) {
swap(*(begin + j), *(end - ));
--j;
}
}
++i;
swap(*(begin + i), *(end - ));
return i;
} //返回第k小的元素,要求输入元素互异,最坏情况下时间复杂度为线性
int Select(int * const begin, int * const end, int k) {
if (end - begin == )
return *begin;
int n = end - begin;
int groupnum = n / ; //groupnum个组,每组五个数
int medium[]; //因小于50000个数 int i, j, t = groupnum;
for (i = , j = ; t--; i += ) {
InsertionSort(begin + i, begin + i + );
medium[j++] = *(begin + i + );
}
if (n > (groupnum * )) {
InsertionSort(begin + i, end);
medium[j++] = *(begin + i + (end - begin - i) / );
} int x = Select(medium, medium + j, (j + ) / );
int m = Partition(begin, end, x) + ;
if (m == k)
return x;
else if (m > k)
return Select(begin, begin + m - , k);
else
return Select(begin + m, end, k - m);
}

最新文章

  1. [01] cocos2d-x开发环境搭建
  2. 基于&lt;MediaElement&gt;的WPF视频播放器(终章)【3】
  3. python logging模块详解[转]
  4. 【BZOJ】1998: [Hnoi2010]Fsk物品调度
  5. Linux系统编程@多线程与多进程GDB调试
  6. DirectX 3D 之C#开发
  7. 编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。
  8. PyCharm 2017 官网 下载 安装 设置 配置 (主题 字体 字号) 使用 入门 教程
  9. LINUX下SYN攻防战 [转]
  10. [NOI 2010]能量采集
  11. 2018-2019-2 20165231《网络对抗技术》Exp0 Kali安装 Week1
  12. xml和java对象互转:JAXB注解的使用详解
  13. Hbase记录-HBase性能优化指南
  14. java 实现websocket
  15. Python开发【模块】:aiohttp(一)
  16. this 的使用方法 —— javascript中的this讲解!
  17. Phpstorm 无法自动断点 Exception
  18. ant design pro (十二)advanced UI 测试
  19. ES6 class 基本使用
  20. andriod学习二 设置开发环境

热门文章

  1. php优惠券生成-去重
  2. input框随输入的文字的多少自动调整宽度粗略版本
  3. HDU-2544 最短路 Dijkstra模板题
  4. 1. 现代 javascript 用法 简介 及 babel
  5. PHP时间戳常用转换
  6. 在storyboard中给控制器添加导航栏控制器和标签控制器
  7. python加速
  8. MySQL和Java数据类型对照表
  9. one_day_one_linuxCmd---wget命令
  10. easyExcel入门