Java手写快速选择算法应用拓展案例
Java手写快速选择算法应用拓展案例
1. 引言
快速选择算法是一种高效的选择算法,可以用于在数组中找到第K小/大的元素。除了基本的应用场景外,快速选择算法还可以应用于其他问题,如查找中位数、查找最大/最小值等。本文将介绍两个拓展应用案例,并提供完整的代码和步骤描述。
2. 拓展应用案例1:查找中位数
中位数是一个有序数组中的中间值。通过快速选择算法,我们可以快速找到一个数组的中位数。
2.1 步骤描述
- 定义一个方法
findMedian,接受一个整型数组arr作为参数。 - 调用
quickSelect方法,传入数组arr、左边界0、右边界arr.length - 1和中位数的位置(arr.length + 1) / 2。 - 在
quickSelect方法中,选择基准元素pivot,并调用partition方法进行分区。 - 根据
partition方法的返回值index,判断中位数的位置:- 如果
index等于(arr.length + 1) / 2 - 1,则返回arr[index]。 - 如果
index大于(arr.length + 1) / 2 - 1,则递归调用quickSelect方法,在左半部分数组中查找中位数。 - 如果
index小于(arr.length + 1) / 2 - 1,则递归调用quickSelect方法,在右半部分数组中查找中位数。
- 如果
- 在
main方法中,调用findMedian方法,并打印中位数的值。
2.2 完整代码
public class QuickSelectMedian {public static void main(String[] args) {int[] arr = {5, 3, 8, 2, 9, 1};int median = findMedian(arr);System.out.println("中位数是:" + median);}private static int findMedian(int[] arr) {return quickSelect(arr, 0, arr.length - 1, (arr.length + 1) / 2);}private static int quickSelect(int[] arr, int left, int right, int k) {int pivot = selectPivot(arr, left, right);int index = partition(arr, left, right, pivot);if (index == k - 1) {return arr[index];} else if (index > k - 1) {return quickSelect(arr, left, index - 1, k);} else {return quickSelect(arr, index, right, k);}}private static int selectPivot(int[] arr, int left, int right) {return arr[left];}private static int partition(int[] arr, int left, int right, int pivot) {int i = left;int j = right;while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr, i, j);i++;j--;}}return i;}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
3. 拓展应用案例2:查找最大/最小值
快速选择算法也可以用于查找一个数组的最大/最小值。
3.1 步骤描述
- 定义一个方法
findMax,接受一个整型数组arr作为参数。 - 调用
quickSelect方法,传入数组arr、左边界0、右边界arr.length - 1和最大值的位置1。 - 在
quickSelect方法中,选择基准元素pivot,并调用partition方法进行分区。 - 根据
partition方法的返回值index,判断最大值的位置:- 如果
index等于1 - 1,则返回arr[index]。 - 如果
index大于1 - 1,则递归调用quickSelect方法,在左半部分数组中查找最大值。 - 如果
index小于1 - 1,则递归调用quickSelect方法,在右半部分数组中查找最大值。
- 如果
- 在
main方法中,调用findMax方法,并打印最大值的值。
3.2 完整代码
public class QuickSelectMax {public static void main(String[] args) {int[] arr = {5, 3, 8, 2, 9, 1};int max = findMax(arr);System.out.println("最大值是:" + max);}private static int findMax(int[] arr) {return quickSelect(arr, 0, arr.length - 1, 1);}private static int quickSelect(int[] arr, int left, int right, int k) {int pivot = selectPivot(arr, left, right);int index = partition(arr, left, right, pivot);if (index == k - 1) {return arr[index];} else if (index > k - 1) {return quickSelect(arr, left, index - 1, k);} else {return quickSelect(arr, index, right, k);}}private static int selectPivot(int[] arr, int left, int right) {return arr[left];}private static int partition(int[] arr, int left, int right, int pivot) {int i = left;int j = right;while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr, i, j);i++;j--;}}return i;}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
4.1 步骤描述
- 定义一个方法
findKthSmallest,接受一个整型数组arr和一个整数k作为参数。 - 调用
quickSelect方法,传入数组arr、左边界0、右边界arr.length - 1和k。 - 在
quickSelect方法中,选择基准元素pivot,并调用partition方法进行分区。 - 根据
partition方法的返回值index,判断第k小的元素的位置:- 如果
index等于k - 1,则返回arr[index]。 - 如果
index大于k - 1,则递归调用quickSelect方法,在左半部分数组中查找第k小的元素。 - 如果
index小于k - 1,则递归调用quickSelect方法,在右半部分数组中查找第k小的元素。
- 如果
- 在
main方法中,调用findKthSmallest方法,并打印第k小的元素的值。
4.2 完整代码
public class QuickSelectKthSmallest {public static void main(String[] args) {int[] arr = {5, 3, 8, 2, 9, 1};int k = 3;int kthSmallest = findKthSmallest(arr, k);System.out.println("第" + k + "小的元素是:" + kthSmallest);}private static int findKthSmallest(int[] arr, int k) {return quickSelect(arr, 0, arr.length - 1, k);}private static int quickSelect(int[] arr, int left, int right, int k) {int pivot = selectPivot(arr, left, right);int index = partition(arr, left, right, pivot);if (index == k - 1) {return arr[index];} else if (index > k - 1) {return quickSelect(arr, left, index - 1, k);} else {return quickSelect(arr, index + 1, right, k);}}private static int selectPivot(int[] arr, int left, int right) {return arr[left];}private static int partition(int[] arr, int left, int right, int pivot) {int i = left;int j = right;while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr, i, j);i++;j--;}}return i;}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
在上面的代码中,我们查找数组 arr 中第3小的元素,即 k = 3。运行结果如下:
第3小的元素是:3
这个例子展示了快速选择算法在查找第k小的元素上的应用。通过快速选择算法,我们可以在平均时间复杂度为O(n)的情况下,快速找到第k小的元素。这对于大数据处理和数据挖掘等领域的应用非常有价值。
4. 结论
通过快速选择算法的拓展应用案例,我们可以看到该算法在查找中位数和查找最大/最小值等问题上的高效性和灵活性。通过手写实现和定制化,我们可以根据实际需求进行优化和改进,提高算法的效率和适用性。快速选择算法在大数据处理、机器学习、数据挖掘等领域有着广泛的应用前景。随着数据规模的不断增大和数据处理需求的不断增加,快速选择算法将发挥更加重要的作用。
相关文章:
Java手写快速选择算法应用拓展案例
Java手写快速选择算法应用拓展案例 1. 引言 快速选择算法是一种高效的选择算法,可以用于在数组中找到第K小/大的元素。除了基本的应用场景外,快速选择算法还可以应用于其他问题,如查找中位数、查找最大/最小值等。本文将介绍两个拓展应用案…...
js制作柱状图的x轴时间, 分别展示 月/周/日 的数据
背景 有个需求是要做一个柱状图, x 轴是时间, y 轴是数量. 其中 x 轴的时间有三种查看方式: 月份/周/日, 也就是分别查看从当前日期开始倒推的最近每月/每周/每日的数量. 本篇文章主要是用来制作三种不同的 x 轴 从当前月开始倒推月份 注意 getMonth() 函数可以获取当前月份…...
安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?
安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&…...
HttpUtils带连接池
准备祖传了,有问题欢迎大家指正。 HttpUtil import com.txlc.cloud.commons.exception.ServiceException; import com.txlc.dwh.common.constants.MyErrorCode; import org.ssssssss.script.annotation.Comment;import java.io.UnsupportedEncodingException; impo…...
智慧养殖:浅谈视频监控与AI智能识别技术助力奶牛高效、智慧养殖
一、方案背景 随着科技的飞速发展,智能化养殖逐渐成为现代畜牧业的发展趋势。人工智能技术、物联网、视频技术、云计算、大数据等新兴技术,正在为奶牛养殖业带来全新的变革。越来越多的牧场、养殖场开始运用新技术来进行智能监管、提高生产效率、降低生…...
一文总结提示工程框架,除了CoT还有ToT、GoT、AoT、SoT、PoT
夕小瑶科技说 原创 编译 | 谢年年 大语言模型LLM被视为一个巨大的知识库,它可以根据你提出问题或陈述的方式来提供答案。就像人类可能会根据问题的不同提供不同的答案一样,LLM也可以根据输入的不同给出不同的答案。因此,你的问题或陈述方式就…...
Java面试笔试acm版输入
首先区分scanner.nextInt()//输入一个整数,只能读取一个数,空格就停止。 scanner.next()//输入字符串,只能读取一个字符串,空格就停止,但是逗号不停止。 scanner.nextLine() 读取一行,换行停止,…...
新手怎样快速上手接口测试?掌握这几个知识点直接起飞!
接口测试是测试系统组件间接口的一种方式,接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的增删改查操作,以及系统之间的逻辑关系等。 接口的几种类型 接口的类型包括:post ,get&…...
IDEA 启动 java web 老项目
背景:一套 java web 老代码,使用 eclipse 工具开发。内网,无 eclipse 开发工具,只有 IDEA。 代码目录结构如下: demo/.settings/* demo/src/com/demo/controller/* demo/webapp/js/* demo/webapp/jsp/* demo/webapp/M…...
软路由和硬路由的区别是什么,性价比与可玩性分析
软路由和硬路由是两种不同类型的路由器设备,它们在基本原理、功能、性能和灵活性等方面存在一些区别: 硬件:软路由是基于一台普通的计算机或服务器,通过软件来实现路由器的功能;而硬路由是专门设计的硬件设备ÿ…...
《TCP/IP网络编程》阅读笔记--多线程服务器端的实现
目录 1--多线程的优点 2--进程和线程的差异 3--线程创建 4--线程使用 5--线程安全问题 6--互斥量 7--信号量 8--线程销毁 9--多线程并发聊天程序 9-1--服务器端 9-2--客户端 9-3--测试结果 1--多线程的优点 多进程服务器的缺点: ① 创建进程的过程会带来…...
修改el-card的header的背景颜色
修改el-card的header的背景颜色 1.修改默认样式 好处是当前页面的所有的el-card都会变化 页面卡片: <el-card class"box-card" ><div slot"header" class"clearfix"><span>卡片名称</span><el-button s…...
ubuntu系统中查看打开的端口
要查看Ubuntu系统中已打开的端口及其相关信息,可以使用以下方法: 打开终端(Terminal)。 运行以下命令以查看当前系统中的端口使用情况: sudo netstat -tuln这将显示所有已打开的端口及其相关信息,包括监听…...
Datax从mysql同步数据到HDFS
在实际使用Datax的时候,比较常用的是同步业务数据(mysql中的数据)到HDFS来实现数仓的创建,那么怎么实现呢?我们一步步来实现(基于Datax 3.0.0) 1、检查环境,需要安装完一个Datax&am…...
使用 Selenium 或其他工具模拟浏览器使用及语法代码
使用Selenium模拟浏览器使用的代码示例如下: from selenium import webdriverfrom selenium.webdriver.common.keys import Keys# 创建浏览器驱动实例driver webdriver.Chrome()# 打开网页driver.get("https://www.example.com")# 查找并填写表单search_…...
华为手机如何开启设置健康使用手机模式限制孩子玩手机时间?
华为手机如何开启设置健康使用手机模式限制孩子玩手机时间? 1、在手机上找到「设置」并点击打开; 2、在设置内找到「健康使用手机」并点击进入; 3、开启健康使用手机后,选择孩子使用; 4、在健康使用手机内,…...
【Linux】线程池 | 自旋锁 | 读写锁
文章目录 一、线程池1. 线程池模型和应用场景2. 单例模式实现线程池(懒汉模式) 二、其他常见的锁1. STL、智能指针和线程安全2. 其他常见的锁 三、读者写者问题1. 读者写者模型2. 读写锁 一、线程池 1. 线程池模型和应用场景 线程池是一种线程使用模式。线程过多会带来调度开…...
[网鼎杯 2020 青龙组]bang 题解
写一道安卓题的WP 首先你需要一个root机,使用真机或者虚拟机,根据网上的教程刷机并获取root 我使用真机调试,pixel2 讲安卓包下载到真机 在PC端配置frida 对应版本的server传送到/data/local/tmp 然后进行以上操作,启动server …...
创建环境时提示:ERROR conda.core.link:_execute(502)
创建环境时提示:ERROR conda.core.link:_execute(502) 创建环境最后Executing transaction,失败,提示如下: Preparing transaction: done Verifying transaction: done Executing transaction: failed ERROR conda.core.link:_e…...
Python150题day07
1.5集合练习题 集合间的运算 lst1 [1, 2, 3, 5, 6, 3, 2] lst2 [2, 5, 7, 9] 哪些整数既在Ist1中,也在Ist2中哪些整数在Ist1中,不在Ist2中两个列表一共有哪些整数 虽然题目问的是两个列表之间的问题,但是用列表解答的效率很低,…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
