一、选择问题
选择问题(selection problem)是求一数组(n个数)中第k(k <= n)个最小元素的问题。

二、三种方法实现
1.确定算法
①Lomuto划分
②Hoare划分
2.非确定算法(概率算法)
③sherwood算法

三、Lomuto划分1
代码:

#include <iostream>
#include <cstdio>
using namespace std;void swap(int* a, int* b) {int temp;temp = *a;*a = *b;*b = temp;
}int Lomuto(int _array[], int l, int r) {int i = l;for(int j = l + 1; j <= r; j++) {if(_array[j] < _array[l]) swap(&_array[++i], &_array[j]);}swap(&_array[i], &_array[l]);return i;
}int Selection(int _array[], int l, int r, int _k) {int mid = Lomuto(_array, l, r);if(mid == (l + _k - 1)) return _array[mid];else if(mid > (l + _k - 1)) Selection(_array, l, mid - 1, _k);else Selection(_array, mid + 1, r, _k - (mid - l + 1));
}int main() {//inputint array[] = {4, 5, 2, 3, 6, 1, 7}, k = 3;int len = sizeof(array) / sizeof(array[0]);//选出第k个最小元素int ans = Selection(array, 0, len - 1, k);//outputprintf("第%d个最小元素:%d", k, ans);return 0;
}

结果:

四、Hoare划分2
代码:

#include <iostream>
#include <cstdio>
using namespace std;void swap(int* a, int* b) {int temp;temp = *a;*a = *b;*b = temp;
}int Hoare(int _array[], int l, int r) {int temp = _array[l];while(l < r) {while(l < r && _array[r] > temp) r--;_array[l] = _array[r];while(l < r && _array[l] <= temp) l++;_array[r] = _array[l];}_array[l] = temp;return l;
}int Selection(int _array[], int l, int r, int _k) {int mid = Hoare(_array, l, r);if(mid == (l + _k - 1)) return _array[mid];else if(mid > (l + _k - 1)) Selection(_array, l, mid - 1, _k);else Selection(_array, mid + 1, r, _k - (mid - l + 1));
}int main() {//inputint array[] = {4, 5, 2, 3, 6, 1, 7}, k = 3;int len = sizeof(array) / sizeof(array[0]);//选出第k个最小元素int ans = Selection(array, 0, len - 1, k);//outputprintf("第%d个最小元素:%d", k, ans);return 0;
}

和“三、Lomuto划分”的代码相比,仅仅改变划分的代码即可

五、sherwood算法
动机:以上两种划分方式,都是选择第一个数作为划分元,但是如果初始数组已经是递增或递减的顺序,则时间复杂度就增大了。

为解决这一问题,在划分之前打乱数组的初始顺序,即洗牌(shuffle)

#include <iostream>
#include <cstdio>
#include <random>
#include <ctime>
using namespace std;void Print(int _array[], int _len) {for(int i = 0; i < _len; i++) {printf("%d", _array[i]);if(i != _len - 1) printf(" ");else printf("\n");}}void swap(int* a, int* b) {int temp;temp = *a;*a = *b;*b = temp;
}int uniform(int n) {return rand() % n;
}void Shuffle(int _array[], int _len) {for(int i = 0; i < _len; i++) {int j = uniform(_len);swap(&_array[i], &_array[j]);}
}int main() {//inputint array[] = {1, 2, 3, 4, 5, 6, 7};int len = sizeof(array) / sizeof(array[0]);printf("数组的初始序列:");Print(array, len);//洗牌srand((unsigned)time(NULL));Shuffle(array, len);//outputprintf("数组的洗牌后序列:");Print(array, len);return 0;
}

结果:

六、扩展阅读


  1. 选择问题(求第k个最小元素) ↩︎

  2. hoare划分 ↩︎

三种方法实现选择问题相关推荐

  1. 台式计算机颜色如何矫正,win10电脑显示器颜色不对如何调整|win10系统校正显示器色调的三种方法...

    正常情况下,电脑安装上win10安装版系统后,显示器颜色都是调好的,难免有些用户觉得显示图片颜色不太准确,看起来非常奇怪,对于制图人员来说,调整一个合适的显示器颜色是非常关键的,这会影响制图效果.大家 ...

  2. php冒泡 插入选择 排序,说说PHP数组的三种排序(冒泡/选择/插入)方法

    说说PHP数组的三种排序(冒泡/选择/插入)方法 PHP #数组 #排序 #冒泡 #选择 #插入2012-05-30 10:17 一.冒泡排序法 说明:找到最大的数,排列到最后面,然后继续找 例: $ ...

  3. 如何确定多少个簇?聚类算法中选择正确簇数量的三种方法

    聚类是一种无监督机器学习方法,可以从数据本身中识别出相似的数据点. 对于一些聚类算法,例如 K-means,需要事先知道有多少个聚类. 如果错误地指定了簇的数量,则结果的效果就会变得很差(参见图 1) ...

  4. vue项目刷新当前页面的三种方法

    本文介绍了vue项目刷新当前页面的三种方法,本文图文并茂给大家介绍的非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 想必大家在刨坑vue的时候也遇到过下面情形:比如在删除或者增加一条记录的时 ...

  5. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  6. 独家 | 将时间信息编码用于机器学习模型的三种编码时间信息作为特征的三种方法...

    作者:Eryk Lewinson 翻译:汪桉旭 校对:zrx本文约4400字,建议阅读5分钟 本文研究了三种使用日期相关的信息如何创造有意义特征的方法. 标签:时间帧,机器学习,Python,技术演示 ...

  7. 独家 | 使EfficientNet更有效率的三种方法(附链接)

    作者:Dominic Masters翻译:王可汗校对:欧阳锦本文约3300字,建议阅读5分钟本文为大家介绍了提升EffcientNet效率和性能的三个策略. 在实践中有更好性能的EfficientNe ...

  8. 安装惠普笔记本XP三种方法

    安装惠普笔记本XP三种方法 方法一.直接下载集成SATA驱动HP OEM XP PRO安装盘     本光盘以HP OEM XP PRO为基础制作的,集成了硬盘SATA驱动,其余部分未做任何改动或者优 ...

  9. 三种方法让信息在局域网中自由散发

    很多人也许都有过这样的经历:正在机房使用电脑时,屏幕上突然弹出一个消息窗口,把你吓了一跳!这些消息窗口通常都是机房或公司的网管发送过来的,目的大多是向使用者公布一些重要事项,例如通知下课啦.或是机房即 ...

最新文章

  1. burpsuite collaborato模块简介 dns log、http_https log、smtp_smtps log
  2. ES聚合底层机制-bucket深的话采用广度优先更好,而如果是年度统计还是深度优先好...
  3. source insight使用
  4. supervisor 重启_Golang HTTP服务平滑重启及升级
  5. 如何将图片序列化_如何将图片文字转化为Word文档?
  6. ORA-00845: MEMORY_TARGET not supported on this system
  7. 6-1图像分类网络模型框架解读(上)
  8. 人脸验证(一)--Deepface
  9. Lack of free swap space on zabbix,增加swap空间
  10. unable to connect to ssl://gateway.sandbox.push.apple.com:2195 错误
  11. Python画新冠肺炎国内和世界各国累计确诊数量热图!某国破百万了
  12. 考研数学张宇常说的段子和道理,自己看视频的时候整理的(欢迎指正、补充)
  13. [渝粤教育] 中国地质大学 信息检索 复习题 (2)
  14. 初学数据分析(一)【利用numpy实现矩阵标准化】
  15. 基于MATLAB的AM信号调制解调代码,代码)基于MATLAB的AM调制解调系统仿真报告
  16. 2.9Unicode 文本标准化
  17. shell命令以及运行原理和Linux权限
  18. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信
  19. 移动应用的黑盒测试(1)
  20. Wpf大屏软件开发过程中遇到的若干问题

热门文章

  1. zbb20181221 java,二维码
  2. 斐波那契1.斐波那契数列
  3. IEC60079-11 附录3电气间隙和爬电距离的计算
  4. Matlab--蒙特卡洛方法求pi值
  5. oracle数据结构体
  6. PCB软件弹出网页的解决方法之一
  7. 平稳过程与广义平稳过程(WSS)
  8. 【转】Kbps、KB、Mbps单位换算
  9. USB Type A/B/C的区别和基本知识
  10. 利用钉钉【上下游组织】搭建企业外部协作平台