博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
随机选择实现
阅读量:7080 次
发布时间:2019-06-28

本文共 1328 字,大约阅读时间需要 4 分钟。

hot3.png

随机选择实现:

可能经常会提到在数组中找第几小或第几大的问题,这里主要以随机选择(找第i小)来实现,其主要思想还是借助快速排序()当中的划分思想来解决,只不过不用对划分后的两个子数组都做处理,只需处理其中一个,思想比较简洁,实现代码如下:

/** * 找出数组种从下标p到r之间第i小的数 * @param arr 目标数组 * @param p 数组起始索引 * @param r 数组结束索引 * @param i 第i小? * @return 第i小的数值 */private static int randomSelect(int[] arr, int p, int r, int i) {	if (p == r) return arr[p];	int q = randomPartition(arr, p, r);	int k = q - p + 1;	if (i == k){ 		return arr[q];	} else if(i < k){ //第i大在左边数组		return randomSelect(arr, p, q-1, i);	} else{ //第i大在右边数组		return randomSelect(arr, q+1, r, i-k);	}}/** * 对数组进行随机划分  * @param arr 待划分数组 * @param p 数组起始索引 * @param r 数组结束索引 * @return 最终基准所在的索引值 */private static int randomPartition(int[] arr, int p, int r) {	//[p..r]间产生一个随机索引	int index = Math.random(p, r); 	ArrayUtil.swap(arr, index, r);	return partition(arr, p, r);}	/** * 对数组进行划分 * @param arr 待划分数组 * @param p 数组起始索引 * @param r 数值结束索引 * @return 基准数的索引 */private static int partition(int[] arr, int p, int r) {	int pivot = arr[r];	int i = p-1;	for (int j=p; j<=r-1; j++){		if (arr[j] < pivot){			i++;			ArrayUtil.swap(arr, i, j);		}	}	ArrayUtil.swap(arr, i+1, r);	return i+1;}
测试用例:
int[] arr = new int[]{12, 32,11, 5,13,4};int target = 2;int res = randomSelect(arr, 0, arr.length-1, target);System.out.println("第"+target +"小的是: " + res);

转载于:https://my.oschina.net/indestiny/blog/205572

你可能感兴趣的文章
MySQL常用简单小命令
查看>>
ERROR: child process failed, exited with error number 100 mongodb报错
查看>>
epoll 使用小结
查看>>
基于TCP套接字实现的简单Demo
查看>>
OpenStack学习
查看>>
LeetCode OJ - Longest Consecutive Sequence
查看>>
柯南剧场版17绝海的侦探
查看>>
20个响应式网页设计中的“神话”误区
查看>>
VB.Net与C# 的语法比较
查看>>
VB6 如何创建一个标准控制台程序
查看>>
大道至简第七章第八章读后感
查看>>
第三章10
查看>>
js 判断文件是否存在
查看>>
让脚趾来控制上千人的网络状态,简直太有成就感了
查看>>
c#调用存储过程实现登录界面
查看>>
vector容器的用法
查看>>
百度技术总监谈12306高性能海量并发网站架构设计
查看>>
将Microsoft Ajax Minifier集成到VS2013对JS、CSS进行编译时压缩
查看>>
测试类。。。重写篇
查看>>
二进制
查看>>