算法笔记_031:计算中值和选择问题(Java)
目录
1 问题描述
中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中间的值被称为中值。
选择问题是求一个n个数列表的第k个最小元素的问题。
2 解决方案
2.1 计算中值问题
本文使用Lomuto划分算法思想,此处引用《算法设计与分析基础》第三版上一段文字介绍及配图,具体如下:
具体实现代码如下:
- package com.liuzhen.chapter4;
- public class MedianProblem {
- //Lomuto划分
- /*
- * 参数A:给定的随机数数组
- * 参数start:开始进行选择的数组元素位置
- * 参数end:最后一个进行选择的数组元素位置
- * 函数功能:返回A[start]到A[end]元素中间的某一元素位置result,使得 左边部分元素 < A[result] <=右边部分元素
- */
- public int LomutoPartition(int[] A,int start,int end){
- int begin = A[start];
- int result = start;
- for(int i = start+1;i <= end;i++){
- if(A[i] < begin){
- /*
- * 一旦出现小于begin的元素,result向后移动一位;
- * 出现大于的不移动,当再次出现小于begin的元素,result向后移动一位,
- * 此时result恰好指向第一个大于begin的元素,此时执行swap(A,result,i)
- */
- result = result + 1;
- swap(A,result,i);
- }
- }
- swap(A,start,result);
- return result;
- }
- //交换数组中位置为m和n上的元素值
- public void swap(int[] A,int m,int n){
- int temp = A[m];
- A[m] = A[n];
- A[n] = temp;
- }
- public static void main(String[] args){
- MedianProblem test = new MedianProblem();
- int[] A = {4,1,10,8,7,12,9,2,15};
- int result = test.LomutoPartition(A, 0, A.length-1);
- System.out.println("对数组进栈Lomuto划分后结果:");
- for(int i = 0;i < A.length;i++)
- System.out.print(A[i]+" ");
- System.out.println("\n"+"进行Lomuto划分后的数组中轴位置:"+result);
- }
- }
运行结果:
- 对数组进栈Lomuto划分后结果:
- 2 1 4 8 7 12 9 10 15
- 进行Lomuto划分后的数组中轴位置:2
2.2 选择问题
通过2.1 计算中值问题中Lomuto算法的运用,那么如何寻找n个元素中第k个最小元素呢?此处调用2.1中相关函数,具体实现代码如下:
- package com.liuzhen.chapter4;
- public class SelectProblem {
- //快速选择
- /*
- * 参数A:给定随机数数组
- * 参数k:要求输出的第k个最小元素
- * 函数功能:返回数组A的第k个最小元素的值
- */
- public int quickSelect(int[] A,int k){
- int start = 0;
- int end = A.length-1;
- int mid = new MedianProblem().LomutoPartition(A, start,end);
- while(true){
- if(mid > k-1){
- end = mid-1;
- mid = new MedianProblem().LomutoPartition(A, start,end);
- }
- else if(mid < k-1){
- start = mid+1;
- mid = new MedianProblem().LomutoPartition(A, start,end);
- }
- else
- break;
- }
- return A[mid];
- }
- public static void main(String[] args){
- SelectProblem test = new SelectProblem();
- int[] A = {4,1,10,8,7,12,9,2,15};
- int result = test.quickSelect(A, 5);
- System.out.println("对数组进行快速选择并执行划分后结果:");
- for(int i = 0;i < A.length;i++)
- System.out.print(A[i]+" ");
- System.out.println("\n"+"进行快速选择后得到数组第5最小元素(从小到大排序):"+result);
- }
- }
运行结果:
- 对数组进行快速选择并执行划分后结果:
- 2 1 4 7 8 12 9 10 15
- 进行快速选择后得到数组第5最小元素(从小到大排序):8
算法笔记_031:计算中值和选择问题(Java)的更多相关文章
- 算法笔记_076:蓝桥杯练习 结点选择(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...
- 算法笔记_075:蓝桥杯练习 最短路(Java)
目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决 1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...
- 算法笔记_083:蓝桥杯练习 合并石子(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...
- 算法笔记_231:网格中移动字母(Java)
目录 1 问题描述 2 解决方案 1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...
- 算法笔记_222:串中取3个不重复字母(Java)
目录 1 问题描述 2 解决方案 1 问题描述 从标准输入读入一个由字母构成的串(不大于30个字符). 从该串中取出3个不重复的字符,求所有的取法. 取出的字符,要求按字母升序排列成一个串. 不同 ...
- 算法笔记_035:寻找最小的k个数(Java)
目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法 1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...
- 算法笔记_184:历届试题 约数倍数选卡片(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数 ...
- 算法笔记_065:分治法求逆序对(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序) 1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...
- 算法笔记_017:递归执行顺序的探讨(Java)
目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排 ...
随机推荐
- 【UOJ #110】【APIO 2015】Bali Sculptures
http://uoj.ac/problem/110 这道题subtask4和subtask5是不同的算法. 主要思想都是从高位到低位贪心确定答案. 对于subtask4,n比较小,设\(f(i,j)\ ...
- HDU 1057 What Are You Talking About trie树 简单
http://acm.hdu.edu.cn/showproblem.php?pid=1075 题意 : 给一个单词表然后给一些单词,要求翻译单词表中有的单词,没有则直接输出原单词. 翻译文段部分get ...
- 【20181023T3】“新”的家园【虚图】
打死也不告诉你这个名字是我编的 题面 [错解] 哎最短路欸 哎floyd+dijkstra有30分 骗分骗分 [正解] 我们发现n和m(不是E)不是一个数量级的 也就是说,在做传统最短路的时候,很多时 ...
- BZOJ 1030 [JSOI2007]文本生成器(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
- 【期望DP】BZOJ2134- 单选错位
[题目大意] 有n道题,第i道题有ai个选项.一个人把所有的正确答案填到了后面一题上(特殊的,当i=n的时候填到1上),问他期望做对几道题? [思路] 沙茶题……显然每道题的期望是独立的. 对于某道题 ...
- Markdown---锚点使用
Markdown目前还没有支持文内锚点的标记语法:但是支持html,所以锚点可以通过html语法来实现 使用方法 <a href='#jump'>第一个题目</a> 带有锚点的 ...
- Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...
- obd2 J1962M to DB9
- MP2359 1.2A, 24V, 1.4MHz Step-Down Converter in a TSOT23-6
The MP2359 is a monolithic step-down switch mode converter with a built-in power MOSFET.It achieves ...
- setTimeout你知多少
假期这么快就结束了,其实对我来说没什么影响,因为我一周才两节课,对于课多的同学来说,我天天在休假,不要羡慕哟~ 但休假并不代表闲着,还是得苦逼的编代码,唉..一入程序深似海.. 不管学得多少,还是总 ...