次序选择问题 java代码完整实现 分治法
什么是次序选择:
就是需要找出给定序列中第k小元素(其中k大于等于1小于等于n)。
比如当k=3时,我们需要找出该序列中第三小元素。
分治法解决次序选择问题:
我们可以借用随机主元的快速排序的思维去解决该问题(点击查看本人另一篇博文随机化快速排序:随机化快速排序),与快速排序不同的是,在主元下标等于k时,我们就可以直接退出,不需要再进行剩下的分解问题和合并问题解过程。其时间复杂度的数学期望为O(n),是一个非常高效的算法。
比如我们要寻找第4小元素,给定数组为945721683,下面我们对其进行分析:
开始——>(比主元大的用蓝色表示,比主元小的用橙色表示,i指向数组首端的前一个,j指向数组首端,即i=left-1,j=left).
刚开始i指向空,j指向9.
1.随机选择主元,假设选择主元为6;
2.主元6与末尾3交换,变为:945721386
3.主元6与j所指9比较,比6小,j++,j指向4,数组变为:945721386
4.主元6与j所指4比较,比4大,i++,i此时指向9,i与j交换,j++,变为:495721386
5.主元6与j所指5比较,比5大,i++,i此时指向9,i与j交换,j++,变为:459721386
6.主元6与j所指7比较,比7小,j++,变为:457921386
7…省略2138的比较与上述类似,变为:452139786
8.j指向了数组最后一个,即主元,则i+1与主元交换,即9与主元6交换
9.然后判断第4小元素,即k=4与主元下标i+1的大小,若k<i+1,则选取左半边重复上述过程;如果k>i+1,则选取右半边重复上述过程.
直到交换后的主元下标等于k。
代码部分:
public void toSelection(int []arr,int left,int right,int k) {int principalElement = left+(int)(Math.random()*(right-left+1)); //选取随机主元//把随机主元放到数组尾部int temp = arr[principalElement];arr[principalElement] = arr[right];arr[right] = temp;int i = left -1;for(int j = left;j<right;j++) {if(arr[j]<arr[right]) {++i;int temp1 = arr[j];arr[j] = arr[i];arr[i] = temp1;}}int temp2 = arr[right];arr[right] = arr[i+1];arr[i+1] = temp2;if(k == i+1)System.out.print("第"+(k+1)+"小数为:"+arr[k]);if(k<i+1)toSelection(arr,left,i,k);if(k>i+1)toSelection(arr, i+2, right, k);
}
函数调用,运行结果:
次序选择问题 java代码完整实现 分治法相关推荐
- 求解最大连续子序列和问题(Java)蛮力法+分治法
求解最大连续子序列和问题 [问题描述] 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和. [样例输入] 6 -2 11 -4 13 -5 -2 [样例输出] 20 [问题求 ...
- 亿级别记录的mongodb批量导入Es的java代码完整实现
针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用Es查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...
- 选择排序java代码_JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- es java bulk 导入数据一直超时_亿级别记录的mongodb批量导入ElasticSearch的java代码完整实现...
针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用ES查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...
- 分治法详解二维最近点对问题
目录 1 前言 2 问题描述 3 分治法 4 暴力求解 4.1 算法思路 4.2 时间复杂度分析 4.3 代码实现 5 分治法求解 5.1 算法思路 5.1.1 数据预处理 5.1.2 划分中轴线 5 ...
- 分治法解决组合总和问题(leetcode216)
nums数组中元素是正整数 大问题转换为小问题 思路和分治法解决组合相同,代码也相似 分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客 只不过递归出口时需要判断组合总和是否为n ...
- Python课后作业 2. 分治法找假币 ----(第八次作业)
文章目录 前引闲聊 原题题目 代码实现(分治法 真的麻了) 代码实现(一次遍历) 提交结果 前引闲聊 我说实话 这道题真的好无聊好无聊好无聊 我就这样说嘛 这道题有好蠢 我们只需要一次遍历 就是如果数 ...
- c语言分治法求众数重数_分治法求众数问题 (配图)
标签: 采用分治法,以中间为界限, 先计算围绕中间这个数字的众数情况,然后左右分开递归计算结果,取最值即可. 左右递归计算的时候要先做判断,假如左边或是右边的个数都比已求的重数小,就没必要计算了,即使 ...
- 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话 ...
最新文章
- 自动化测试基础篇--Selenium框架设计(POM)
- 端口扫描器——ZenmapKail Linux渗透测
- OJ8462-大盗阿福【各种dp之5】
- adobe 书签怎么设置_让我们设置一些规则…没有Adobe Analytics处理规则
- [css] 怎么让body高度自适应屏幕?为什么?
- C#中split分隔字符串的应用
- Appium环境搭建(Java版本)
- 转到Visual Studio中的匹配括号吗?
- Ubuntu修改su和sudo密码
- java作用域public ,private ,protected 及不写时的区别(转)
- golang db事务的统一封装
- Java applet详解
- 小白可以来看看磁盘与文件管理实验
- 【组队学习】【32期】组队学习内容详情
- Windows上的Oracle检查列表。 (文档ID 443813.1)
- 联客云虚拟工作手机(云手机)应用行业及场景
- 爱奇艺千亿级数据查询服务实践
- Linux服务详解(主要基于RedHat系的及Centos默认服务详解)(综合整理)
- matlab颜色直方图特征提取,灰度直方图特征提取的Matlab实现
- C Primer Plus(6) 中文版 第9章 函数 9.1 复习函数