目录

1 问题描述 

2 解决方案

2.1 计算中值问题

2.2 选择问题

 


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)的更多相关文章

  1. 算法笔记_076:蓝桥杯练习 结点选择(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...

  2. 算法笔记_075:蓝桥杯练习 最短路(Java)

    目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决   1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...

  3. 算法笔记_083:蓝桥杯练习 合并石子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...

  4. 算法笔记_231:网格中移动字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...

  5. 算法笔记_222:串中取3个不重复字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 从标准输入读入一个由字母构成的串(不大于30个字符). 从该串中取出3个不重复的字符,求所有的取法. 取出的字符,要求按字母升序排列成一个串. 不同 ...

  6. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  7. 算法笔记_184:历届试题 约数倍数选卡片(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数 ...

  8. 算法笔记_065:分治法求逆序对(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...

  9. 算法笔记_017:递归执行顺序的探讨(Java)

    目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排 ...

随机推荐

  1. codevs 1044 拦截导弹 1999年NOIP全国联赛提高组

    1044 拦截导弹 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 某国为 ...

  2. HDU 6119 小小粉丝度度熊(Two pointers)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6119 [题目大意] 给出一些签到区间和一些补签卡,问可以创造的最长连续签到区间 [题解] 如果我们 ...

  3. python开发_pprint()

    python中的pprint.pprint(),类似于print() 下面是我做的demo: #python pprint '''python API中提供的Sample''' import json ...

  4. 红帽子企业版 7.3 INSTALL SYSTEMTAP

    [root@workstation2017 ~]# uname -r 1.安装程序 yum install systemtap systemtap-runtime // 这个会被安装 systemta ...

  5. 对 dpif_class 结构体的一点认识

         类 dpif_class 抽象的是OVS交换机用户空间和内核层datapath的通信接口(通过netlink),分层是出于性能和生产效率的考虑,通过接口dpif_class,用户层ovs-v ...

  6. 【iOS开发-图层】图层的获取与一些属性

    图层 每个控件都有自己的一个图层,这个空间的全部东西就是显示在这个图层上面的,控件本身没有显示东西的功能,仅仅有拥有了图层才干显示东西 图层的获取 CALayer *layer = self.test ...

  7. [Lua]mac 上安装lua

    mac 安装lua google了好个看起来都不怎么好操作.这个是在命令行下操作的非常easy. curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz ...

  8. java_Collection_详细介绍

    转自:http://blog.sina.com.cn/s/blog_3fb3625f0101aref.html 1.类集框架 java.util 包中包含了一些在 Java 2 中新增加的最令人兴奋的 ...

  9. 如何使用V7包中ActionBar(Eclipse版)

    转自:http://blog.csdn.net/appte/article/details/11712591 以前3.0以前的版本要使用ActionBar,必须使用国外大牛写的ActionBarShe ...

  10. [翻译] Blocks and Variables

    Blocks and Variables https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Blocks/A ...