当前位置: 首页 > news >正文

随机选择实现

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

随机选择实现:

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

/**
 * 找出数组种从下标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

相关文章:

  • 重读金典------高质量C编程指南(林锐)-------第六章 函数设计
  • Oracle 修改表列属性
  • CKEditor如何统计文字数量
  • Oracle 11G创建表空间、用户、授权命令(Oracle 11g使用)
  • TIMESTAMP with ****问题连不上mysql
  • window.location.href的一种用法
  • StringBuffer 用法
  • 创建本地CM 离线服务器
  • mysql 每日简单备份和定期删除
  • 无法远程连接 MySQL 的解决方法
  • IOS UISearchDisplayController 点击搜索出现黑条问题解决方案
  • Python进阶07 函数对象
  • 为文本数据创建索引
  • haproxy配置文档说明
  • Android中 android:layout_weight 属性 完美解释
  • ES6 ...操作符
  • extract-text-webpack-plugin用法
  • HTTP--网络协议分层,http历史(二)
  • JavaScript新鲜事·第5期
  • Just for fun——迅速写完快速排序
  • Linux中的硬链接与软链接
  • rabbitmq延迟消息示例
  • sublime配置文件
  • Yii源码解读-服务定位器(Service Locator)
  • 浮现式设计
  • 马上搞懂 GeoJSON
  • 世界上最简单的无等待算法(getAndIncrement)
  • 一个JAVA程序员成长之路分享
  • 自动记录MySQL慢查询快照脚本
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ###项目技术发展史
  • #vue3 实现前端下载excel文件模板功能
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (接口自动化)Python3操作MySQL数据库
  • (一)为什么要选择C++
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)【Hibernate总结系列】使用举例
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开发者必备的11款免费工具
  • @PreAuthorize注解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [BJDCTF 2020]easy_md5
  • [Bugku]密码???[writeup]