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);
}

Select(快速选择顺序统计量)原理及C++代码实现的更多相关文章

  1. 【转载】Select函数实现原理分析

    Select函数实现原理分析 <原文> select需要驱动程序的支持,驱动程序实现fops内的poll函数.select通过每个设备文件对应的poll函数提供的信息判断当前是否有资源可用 ...

  2. 编译原理-词法分析04-NFA & 代码实现

    编译原理-词法分析04-NFA & 代码实现 0.术语 NFA 非确定性有穷自动机nondeterministic finite automation. ε-转换ε-transition 是无 ...

  3. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  4. 最短路径A*算法原理及java代码实现(看不懂是我的失败)

    算法仅仅要懂原理了,代码都是小问题,先看以下理论,尤其是红色标注的(要源代码请留下邮箱,有測试用例,直接执行就可以) A*算法 百度上的解释: A*[1](A-Star)算法是一种静态路网中求解最短路 ...

  5. 对象部分初始化:原理以及验证代码(双重检查锁与volatile相关)

    对象部分初始化:原理以及验证代码(双重检查锁与volatile相关) 对象部分初始化被称为 Partially initialized objects / Partially constructed ...

  6. DEDECMS数据库执行原理、CMS代码层SQL注入防御思路

    我们在上一篇文章中学习了DEDECMS的模板标签.模板解析原理,以及通过对模板核心类的Hook Patch来对模板的解析流量的攻击模式检测,达到修复模板类代码执行漏洞的目的 http://www.cn ...

  7. 一致性Hash算法原理及C#代码实现

    一.一致性Hash算法原理 基本概念 一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下: 整个空间按顺 ...

  8. nio原理和示例代码

    我正在为学习大数据打基础中,为了手撸rpc框架,需要懂得nio的原理,在搞懂nio框架前,我会带着大家手撸一些比较底层的代码,当然今后当我们学会了框架,这些繁琐的代码也就不用写了,但是学一学底层的代码 ...

  9. 【原创】Linux select/poll机制原理分析

    前言 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 1. 概述 Linux系统 ...

随机推荐

  1. quartz 集成到Spring中

    记录一下,防止忘记. 需要的jar包,quartz-2.2.3.jar,commons-collection-3.1.jar,spring-context-support-4.3.4.RELEASE. ...

  2. A4纸网页打印

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Mybatis核心类生命周期和管理

    Mybatis核心类生命周期和管理 原文链接:https://blog.csdn.net/qq1134550437/article/details/51960480 1.SqlSessionFacto ...

  4. MySQL--InnoDB 体系架构

    InnoDB 体系架构 后台线程 Master Thread Master Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新.合并插入缓 ...

  5. 最小二乘拟合(scipy实现)

    Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数.如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等. 如下理解通过Scipy进行最小二乘法拟合运算 最小二乘拟合 ...

  6. 选择排序&冒泡排序

    //直接选择排序 #include<stdio.h> void SelectionSort(int arr[],int len) { int i,j; int k,min; int tem ...

  7. h5-FileReader对象的使用

    <!--FileReader对象的使用--> <!--需要及时预览 及时:当用户选择完图片之后就立即进行预览处理--onchange事件 预览:通过文件读取对象的readAsData ...

  8. CI项目设计Redis队列

    项目开发过程中需要设计提供可平衡的处理多个用户请求的队列. 需求: 当用户登录后,查看系统中已经登录的管理员队列,然后查看后台管理员的处理能力,如果已经不能处理新的请求,则把该管理员从处理队列中删除, ...

  9. MyBatis从入门到精通(第2章):MyBatis XML方式的基本用法【insert用法、update用法、delete用法】

    2.4  insert 用法 2.4.1  简单的 insert方法 在接口 UserMapper.java 中添加如下方法. /** * 新增用户 * @param sysUser * @retur ...

  10. 题解 P5837 【[USACO19DEC]Milk Pumping】

    这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了 1.怎么记: 首先考虑dp的状态.由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪 //dp[i] ...