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

Java手写快速选择算法应用拓展案例

Java手写快速选择算法应用拓展案例

1. 引言

快速选择算法是一种高效的选择算法,可以用于在数组中找到第K小/大的元素。除了基本的应用场景外,快速选择算法还可以应用于其他问题,如查找中位数、查找最大/最小值等。本文将介绍两个拓展应用案例,并提供完整的代码和步骤描述。

2. 拓展应用案例1:查找中位数

中位数是一个有序数组中的中间值。通过快速选择算法,我们可以快速找到一个数组的中位数。

2.1 步骤描述

  1. 定义一个方法 findMedian,接受一个整型数组 arr 作为参数。
  2. 调用 quickSelect 方法,传入数组 arr、左边界 0、右边界 arr.length - 1 和中位数的位置 (arr.length + 1) / 2
  3. quickSelect 方法中,选择基准元素 pivot,并调用 partition 方法进行分区。
  4. 根据 partition 方法的返回值 index,判断中位数的位置:
    • 如果 index 等于 (arr.length + 1) / 2 - 1,则返回 arr[index]
    • 如果 index 大于 (arr.length + 1) / 2 - 1,则递归调用 quickSelect 方法,在左半部分数组中查找中位数。
    • 如果 index 小于 (arr.length + 1) / 2 - 1,则递归调用 quickSelect 方法,在右半部分数组中查找中位数。
  5. 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 步骤描述

  1. 定义一个方法 findMax,接受一个整型数组 arr 作为参数。
  2. 调用 quickSelect 方法,传入数组 arr、左边界 0、右边界 arr.length - 1 和最大值的位置 1
  3. quickSelect 方法中,选择基准元素 pivot,并调用 partition 方法进行分区。
  4. 根据 partition 方法的返回值 index,判断最大值的位置:
    • 如果 index 等于 1 - 1,则返回 arr[index]
    • 如果 index 大于 1 - 1,则递归调用 quickSelect 方法,在左半部分数组中查找最大值。
    • 如果 index 小于 1 - 1,则递归调用 quickSelect 方法,在右半部分数组中查找最大值。
  5. 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 步骤描述

  1. 定义一个方法 findKthSmallest,接受一个整型数组 arr 和一个整数 k 作为参数。
  2. 调用 quickSelect 方法,传入数组 arr、左边界 0、右边界 arr.length - 1k
  3. quickSelect 方法中,选择基准元素 pivot,并调用 partition 方法进行分区。
  4. 根据 partition 方法的返回值 index,判断第k小的元素的位置:
    • 如果 index 等于 k - 1,则返回 arr[index]
    • 如果 index 大于 k - 1,则递归调用 quickSelect 方法,在左半部分数组中查找第k小的元素。
    • 如果 index 小于 k - 1,则递归调用 quickSelect 方法,在右半部分数组中查找第k小的元素。
  5. 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. 引言 快速选择算法是一种高效的选择算法&#xff0c;可以用于在数组中找到第K小/大的元素。除了基本的应用场景外&#xff0c;快速选择算法还可以应用于其他问题&#xff0c;如查找中位数、查找最大/最小值等。本文将介绍两个拓展应用案…...

js制作柱状图的x轴时间, 分别展示 月/周/日 的数据

背景 有个需求是要做一个柱状图, x 轴是时间, y 轴是数量. 其中 x 轴的时间有三种查看方式: 月份/周/日, 也就是分别查看从当前日期开始倒推的最近每月/每周/每日的数量. 本篇文章主要是用来制作三种不同的 x 轴 从当前月开始倒推月份 注意 getMonth() 函数可以获取当前月份…...

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?

安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&…...

HttpUtils带连接池

准备祖传了&#xff0c;有问题欢迎大家指正。 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智能识别技术助力奶牛高效、智慧养殖

一、方案背景 随着科技的飞速发展&#xff0c;智能化养殖逐渐成为现代畜牧业的发展趋势。人工智能技术、物联网、视频技术、云计算、大数据等新兴技术&#xff0c;正在为奶牛养殖业带来全新的变革。越来越多的牧场、养殖场开始运用新技术来进行智能监管、提高生产效率、降低生…...

一文总结提示工程框架,除了CoT还有ToT、GoT、AoT、SoT、PoT

夕小瑶科技说 原创 编译 | 谢年年 大语言模型LLM被视为一个巨大的知识库&#xff0c;它可以根据你提出问题或陈述的方式来提供答案。就像人类可能会根据问题的不同提供不同的答案一样&#xff0c;LLM也可以根据输入的不同给出不同的答案。因此&#xff0c;你的问题或陈述方式就…...

Java面试笔试acm版输入

首先区分scanner.nextInt()//输入一个整数&#xff0c;只能读取一个数&#xff0c;空格就停止。 scanner.next()//输入字符串&#xff0c;只能读取一个字符串&#xff0c;空格就停止&#xff0c;但是逗号不停止。 scanner.nextLine() 读取一行&#xff0c;换行停止&#xff0c…...

新手怎样快速上手接口测试?掌握这几个知识点直接起飞!

接口测试是测试系统组件间接口的一种方式&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的增删改查操作&#xff0c;以及系统之间的逻辑关系等。 接口的几种类型 接口的类型包括&#xff1a;post &#xff0c;get&…...

IDEA 启动 java web 老项目

背景&#xff1a;一套 java web 老代码&#xff0c;使用 eclipse 工具开发。内网&#xff0c;无 eclipse 开发工具&#xff0c;只有 IDEA。 代码目录结构如下&#xff1a; demo/.settings/* demo/src/com/demo/controller/* demo/webapp/js/* demo/webapp/jsp/* demo/webapp/M…...

软路由和硬路由的区别是什么,性价比与可玩性分析

软路由和硬路由是两种不同类型的路由器设备&#xff0c;它们在基本原理、功能、性能和灵活性等方面存在一些区别&#xff1a; 硬件&#xff1a;软路由是基于一台普通的计算机或服务器&#xff0c;通过软件来实现路由器的功能&#xff1b;而硬路由是专门设计的硬件设备&#xff…...

《TCP/IP网络编程》阅读笔记--多线程服务器端的实现

目录 1--多线程的优点 2--进程和线程的差异 3--线程创建 4--线程使用 5--线程安全问题 6--互斥量 7--信号量 8--线程销毁 9--多线程并发聊天程序 9-1--服务器端 9-2--客户端 9-3--测试结果 1--多线程的优点 多进程服务器的缺点&#xff1a; ① 创建进程的过程会带来…...

修改el-card的header的背景颜色

修改el-card的header的背景颜色 1.修改默认样式 好处是当前页面的所有的el-card都会变化 页面卡片&#xff1a; <el-card class"box-card" ><div slot"header" class"clearfix"><span>卡片名称</span><el-button s…...

ubuntu系统中查看打开的端口

要查看Ubuntu系统中已打开的端口及其相关信息&#xff0c;可以使用以下方法&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 运行以下命令以查看当前系统中的端口使用情况&#xff1a; sudo netstat -tuln这将显示所有已打开的端口及其相关信息&#xff0c;包括监听…...

Datax从mysql同步数据到HDFS

在实际使用Datax的时候&#xff0c;比较常用的是同步业务数据&#xff08;mysql中的数据&#xff09;到HDFS来实现数仓的创建&#xff0c;那么怎么实现呢&#xff1f;我们一步步来实现&#xff08;基于Datax 3.0.0&#xff09; 1、检查环境&#xff0c;需要安装完一个Datax&am…...

使用 Selenium 或其他工具模拟浏览器使用及语法代码

使用Selenium模拟浏览器使用的代码示例如下&#xff1a; from selenium import webdriverfrom selenium.webdriver.common.keys import Keys# 创建浏览器驱动实例driver webdriver.Chrome()# 打开网页driver.get("https://www.example.com")# 查找并填写表单search_…...

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间?

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间&#xff1f; 1、在手机上找到「设置」并点击打开&#xff1b; 2、在设置内找到「健康使用手机」并点击进入&#xff1b; 3、开启健康使用手机后&#xff0c;选择孩子使用&#xff1b; 4、在健康使用手机内&#xff0c…...

【Linux】线程池 | 自旋锁 | 读写锁

文章目录 一、线程池1. 线程池模型和应用场景2. 单例模式实现线程池(懒汉模式) 二、其他常见的锁1. STL、智能指针和线程安全2. 其他常见的锁 三、读者写者问题1. 读者写者模型2. 读写锁 一、线程池 1. 线程池模型和应用场景 线程池是一种线程使用模式。线程过多会带来调度开…...

[网鼎杯 2020 青龙组]bang 题解

写一道安卓题的WP 首先你需要一个root机&#xff0c;使用真机或者虚拟机&#xff0c;根据网上的教程刷机并获取root 我使用真机调试&#xff0c;pixel2 讲安卓包下载到真机 在PC端配置frida 对应版本的server传送到/data/local/tmp 然后进行以上操作&#xff0c;启动server …...

创建环境时提示:ERROR conda.core.link:_execute(502)

创建环境时提示&#xff1a;ERROR conda.core.link:_execute(502) 创建环境最后Executing transaction&#xff0c;失败&#xff0c;提示如下&#xff1a; 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中&#xff0c;也在Ist2中哪些整数在Ist1中&#xff0c;不在Ist2中两个列表一共有哪些整数 虽然题目问的是两个列表之间的问题&#xff0c;但是用列表解答的效率很低&#xff0c…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...