Select(快速选择顺序统计量)原理及C++代码实现

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

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

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

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

代码如下:(仅供参考)

 1 void InsertionSort(int * const begin, int * const end) {
 2     int i, j, key;
 3     for (i = 1; i < begin - end; ++i) {
 4         key = *(begin + i);
 5         for (j = i - 1; j >= 0 && (*(begin + j) > key); --j) {
 6             *(begin + j + 1) = *(begin + j);
 7         }
 8         *(begin + j + 1) = key;
 9     }
10 }
11 int Partition(int * const begin, int * const end, int x) {
12     int i = -1;
13     for (int j = 0; j < (end - begin); ++j) {
14         if (*(begin + j) < x) {
15             ++i;
16             swap(*(begin + i), *(begin + j));
17         }
18         else if (*(begin + j) == x && j != (end - begin - 1)) {
19             swap(*(begin + j), *(end - 1));
20             --j;
21         }
22     }
23     ++i;
24     swap(*(begin + i), *(end - 1));
25     return i;
26 }
27
28 //返回第k小的元素,要求输入元素互异,最坏情况下时间复杂度为线性
29 int Select(int * const begin, int * const end, int k) {
30     if (end - begin == 1)
31         return *begin;
32     int n = end - begin;
33     int groupnum = n / 5; //groupnum个组,每组五个数
34     int medium[10000]; //因小于50000个数
35
36     int i, j, t = groupnum;
37     for (i = 0, j = 0; t--; i += 5) {
38         InsertionSort(begin + i, begin + i + 5);
39         medium[j++] = *(begin + i + 2);
40     }
41     if (n > (groupnum * 5)) {
42         InsertionSort(begin + i, end);
43         medium[j++] = *(begin + i + (end - begin - i) / 2);
44     }
45
46     int x = Select(medium, medium + j, (j + 1) / 2);
47     int m = Partition(begin, end, x) + 1;
48     if (m == k)
49         return x;
50     else if (m > k)
51         return Select(begin, begin + m - 1, k);
52     else
53         return Select(begin + m, end, k - m);
54 }

原文地址:https://www.cnblogs.com/yxsrt/p/12193807.html

时间: 2024-08-03 22:18:26

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

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

Select函数实现原理分析 <原文> select需要驱动程序的支持,驱动程序实现fops内的poll函数.select通过每个设备文件对应的poll函数提供的信息判断当前是否有资源可用(如可读或写),如果有的话则返回可用资源的文件描述符个数,没有的话则睡眠,等待有资源变为可用时再被唤醒继续执行. 下面我们分两个过程来分析select: 1. select的睡眠过程 支持阻塞操作的设备驱动通常会实现一组自身的等待队列如读/写等待队列用于支持上层(用户层)所需的BLOCK(阻塞)或NONBLO

二级域名原理以及程序代码

二级域名原理以及程序代码 TYPE:经典代码片段 TIME:2002-7-30 AUTHOR:扬子 URL:N/A HIT:51  DAYHIT:1  WEEKHIT:1 要达到二级名的效果,必须一下条件以及流程: 1.必须有一个顶级域名,而且此域名必须做好泛解析并做好指向. 2.必须有一台独立的服务器.泛解析的域名指向该服务器. 3.在服务器上的IIS建一个空的主机头名的web站点. 4.将默认的页面设置为你的二机解析程序(比如:freedns.asp) 5.二级域名系列程序(包括申请页:sh

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

算法只要懂原理了,代码都是小问题,先看下面理论,尤其是红色标注的(要源码请留下邮箱,有测试用例,直接运行即可) A*算法 百度上的解释: A*[1](A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法. 公式表示为: f(n)=g(n)+h(n), 其中 f(n) 是从初始点经由节点n到目标点的估价函数, g(n) 是在状态空间中从初始节点到n节点的实际代价, h(n) 是从n到目标节点最佳路径的估计代价. 保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取: 估价值

javaNIO原理(含代码)及与 同步阻塞IO 、伪异步IO比较

一.同步阻塞IO BIO就是阻塞式的IO,网络通信中对于多客户端的连入,服务器端总是与客户端数量一致的线程去处理每个客户端任务,即,客户端与线程数1:1,并且进行读写操作室阻塞的,当有你成千上完的客户端进行连接,就导致服务器不断的建立新的线程,最后导致低通资源不足,后面的客户端不能连接服务器,并且连接入的客户端并不是总是在于服务器进行交互,很可能就只是占用着资源而已. 二.伪异步IO 伪异步IO对同步IO进行了优化,后端通过一个线程池和任务队列去处理所有客户端的请求,当用完后在归还给线程池,线程

nio原理分析与代码实现

io共性:每个线程的处理流程大概都是读取数据.解码.计算处理.编码.发送响应. 标准的IO基于字节流和字符流进行操作的, 而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中. Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入. 当线程从通道读取数据到缓冲区时,

nio原理和示例代码

我正在为学习大数据打基础中,为了手撸rpc框架,需要懂得nio的原理,在搞懂nio框架前,我会带着大家手撸一些比较底层的代码,当然今后当我们学会了框架,这些繁琐的代码也就不用写了,但是学一学底层的代码也是有好处的嘛. java.nio全称java non-blocking IO(实际上是 new io),是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络. 前面我写的socket的

PHPDDOS攻击原理以及核心代码

前几天某些服务器被打得像狗,各种攻击呀,分析了一下,估计是用PHPDDOS干的,现在抓鸡艰难,哪有那么多鸟人可以抓到那么多鸡,成本也高.PHPDDOS就不一样了,拿到了shell就可以直接用来攻击了,真是杀人越货,居家旅行,必备神器. PHPDDOS的原理是使用一个主控端批量向被控端(也就是特殊的webshell)发送攻击命令,方式一般是get或者post,达到统一指挥的目的.而被控端一般使用了php中的sock来进行攻击,在php越来越流行的今天,这种攻击必然会越来越流行. 去翻了一下,找到了

朴素贝叶斯分类算法原理分析与代码实现

前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果是挺不错的. 在说明原理之前,先介绍一个叫词向量的概念. --- 它一般是一个布尔类型的集合,该集合中每个元素都表示其对应的单词是否在文档中出现. 对应关系和词汇表一一对应. 比如说,词汇表只有三个单词:'apple', 'orange', 'melo',某文档中,apple和melo出现过,那么其对应的词向量就是 {1, 0, 1}. 这种模型

第五篇:朴素贝叶斯分类算法原理分析与代码实现

前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果挺不错的. 在说明原理之前,先介绍一个叫词向量的概念. --- 它一般是一个布尔类型的集合,该集合中每个元素都表示其对应的单词是否在文档中出现. 比如说,词汇表只有三个单词:'apple', 'orange', 'melo',某文档中,apple和melo出现过,那么其对应的词向量就是 {1, 0, 1}. 这种模型通常称为词集模型,如果词向量元