什么是次序选择:

就是需要找出给定序列中第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代码完整实现 分治法相关推荐

  1. 求解最大连续子序列和问题(Java)蛮力法+分治法

    求解最大连续子序列和问题 [问题描述] 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和. [样例输入] 6 -2 11 -4 13 -5 -2 [样例输出] 20 [问题求 ...

  2. 亿级别记录的mongodb批量导入Es的java代码完整实现

    针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用Es查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...

  3. 选择排序java代码_JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  4. es java bulk 导入数据一直超时_亿级别记录的mongodb批量导入ElasticSearch的java代码完整实现...

    针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用ES查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...

  5. 分治法详解二维最近点对问题

    目录 1 前言 2 问题描述 3 分治法 4 暴力求解 4.1 算法思路 4.2 时间复杂度分析 4.3 代码实现 5 分治法求解 5.1 算法思路 5.1.1 数据预处理 5.1.2 划分中轴线 5 ...

  6. 分治法解决组合总和问题(leetcode216)

    nums数组中元素是正整数 大问题转换为小问题 思路和分治法解决组合相同,代码也相似 分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客 只不过递归出口时需要判断组合总和是否为n ...

  7. Python课后作业 2. 分治法找假币 ----(第八次作业)

    文章目录 前引闲聊 原题题目 代码实现(分治法 真的麻了) 代码实现(一次遍历) 提交结果 前引闲聊 我说实话 这道题真的好无聊好无聊好无聊 我就这样说嘛 这道题有好蠢 我们只需要一次遍历 就是如果数 ...

  8. c语言分治法求众数重数_分治法求众数问题 (配图)

    标签: 采用分治法,以中间为界限, 先计算围绕中间这个数字的众数情况,然后左右分开递归计算结果,取最值即可. 左右递归计算的时候要先做判断,假如左边或是右边的个数都比已求的重数小,就没必要计算了,即使 ...

  9. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

最新文章

  1. 自动化测试基础篇--Selenium框架设计(POM)
  2. 端口扫描器——ZenmapKail Linux渗透测
  3. OJ8462-大盗阿福【各种dp之5】
  4. adobe 书签怎么设置_让我们设置一些规则…没有Adobe Analytics处理规则
  5. [css] 怎么让body高度自适应屏幕?为什么?
  6. C#中split分隔字符串的应用
  7. Appium环境搭建(Java版本)
  8. 转到Visual Studio中的匹配括号吗?
  9. Ubuntu修改su和sudo密码
  10. java作用域public ,private ,protected 及不写时的区别(转)
  11. golang db事务的统一封装
  12. Java applet详解
  13. 小白可以来看看磁盘与文件管理实验
  14. 【组队学习】【32期】组队学习内容详情
  15. Windows上的Oracle检查列表。 (文档ID 443813.1)
  16. 联客云虚拟工作手机(云手机)应用行业及场景
  17. 爱奇艺千亿级数据查询服务实践
  18. Linux服务详解(主要基于RedHat系的及Centos默认服务详解)(综合整理)
  19. matlab颜色直方图特征提取,灰度直方图特征提取的Matlab实现
  20. C Primer Plus(6) 中文版 第9章 函数 9.1 复习函数

热门文章

  1. Message:Message: 前言中不允许有内容
  2. 计网考点 使用广播信道的数据链路层
  3. 探索Kotlin的隐性成本
  4. mysql 中 RPAD函数
  5. Android关于线程优化以及性能优化的一些建议
  6. 小米将推1500元的红米note9,OPPO却继续玩低配高价
  7. Linux操作系统下测试磁盘读写速度
  8. SVM算法原理以及实现
  9. 各种视频输出端口(HDMI、DVI、VGA、RGB、分量、S端子)图片说明
  10. C#Opencvsharp4实现几种图像特效