快速排序算法java实现
快速排序是一种基于分治的排序算法它选择一个元素作为枢轴并通过将该枢轴置于排序后的数组中正确位置来划分。该算法主要包含三个步骤选择枢轴从数组中选择一个元素作为枢轴。枢轴的选择可以有所不同例如第一元素、最后元素、随机元素或中位数。数组划分重新排列数组围绕枢轴。划分后所有小于枢轴的元素位于其左侧所有大于枢轴的元素位于其右侧。递归调用递归地将相同进程应用于两个分区子数组。基础情况当子数组中只剩一个元素时递归停止因为单个元素已被排序。枢轴选择选择枢轴有很多不同的选择。始终选择第一个或最后一个元素作为枢轴。下面的实现选择了最后一个元素作为枢轴。这种方法的问题在于最坏的情况往往是数组已经排序好。随机选一个元素作为枢轴。这是一种首选方法因为它没有最坏情况发生的模式。选择中位数元素是枢轴。从时间复杂度角度看这是一种理想的方法因为我们可以在线性时间内找到中位数且配分函数总是将输入数组分为两半。但平均来说需要更多时间因为中位数的发现常数很高。划分算法快速排序中的密钥进程是一个分区。 有三种常见的划分算法。所有这些算法的时间复杂度均为On。朴素划分这里我们创建数组的副本。先放所有较小的元素然后放更大的。最后我们将临时数组复制回原始数组。这需要 On 额外的空间。洛穆托分区本文中使用了该分区。这是一个简单的算法我们跟踪较小元素的索引并不断交换。本文中我们使用它因为它非常简单。霍尔分区这是所有分区中最快的。这里我们从两侧遍历数组并在数组未分割的情况下不断交换左侧较大元素与右侧较小元素。详情请参阅Hoare对Lomuto的对决。Lomuto划分算法的工作原理及示意图逻辑很简单我们从最左边的元素开始并跟踪较小或相等元素的索引作为 i。在遍历过程中如果发现一个较小的元素我们会将当前元素与 arr[i] 交换。否则我们忽略当前元素。重定向图标让我们通过以下示例来理解分区算法的工作原理快速排序算法示意在前一步我们研究了分区过程如何根据所选枢轴重新排列数组。接下来我们递归地将同样的方法应用到枢轴左右两个较小的子数组 。每次我们都选择新的枢轴点并再次划分数组。这个过程会持续直到只剩下一个元素并且总是被排序。一旦每个元素都处于正确位置整个数组就被排序。下图展示了递归方法如何调用枢轴左右两个较小子数组import java.util.Arrays; class GfG { // partition function static int partition(int[] arr, int low, int high) { // choose the pivot int pivot arr[high]; // index of smaller element and indicates // the right position of pivot found so far int i low - 1; // traverse arr[low..high] and move all smaller // elements to the left side. Elements from low to // i are smaller after every iteration for (int j low; j high - 1; j) { if (arr[j] pivot) { i; swap(arr, i, j); } } // Move pivot after smaller elements and // return its position swap(arr, i 1, high); return i 1; } // swap function static void swap(int[] arr, int i, int j) { int temp arr[i]; arr[i] arr[j]; arr[j] temp; } // the QuickSort function implementation static void quickSort(int[] arr, int low, int high) { if (low high) { // pi is the partition return index of pivot int pi partition(arr, low, high); // recursion calls for smaller elements // and greater or equals elements quickSort(arr, low, pi - 1); quickSort(arr, pi 1, high); } } public static void main(String[] args) { int[] arr {10, 7, 8, 9, 1, 5}; int n arr.length; quickSort(arr, 0, n - 1); for (int val : arr) { System.out.print(val ); } } }输出1 5 7 8 9 10快速排序的复杂度分析时间复杂性最佳情况Ωn log n当枢轴元素将数组分为两个相等的一半时发生。平均情况 θn log n平均而言枢轴将数组分为两部分但不一定相等。最坏情况On²当始终选择最小或最大元素作为枢轴时例如已排序的数组。辅助空间最坏情况由于不平衡划分导致递归树倾斜需要调用栈大小为 On 的 On。最佳情况由于平衡分区Olog n 生成了一个具有调用栈大小为 Olog n 的平衡递归树。详情请参阅快速排序的时间与空间复杂性分析。快速排序的优势它是一种分而治之的算法使解决问题变得更容易。它在大数据集上效率很高。它开销低只需少量内存即可运行。它对缓存友好因为我们在同一数组上进行排序且不会将数据复制到任何辅助数组。在不需要稳定性的情况下是处理大数据的最快通用算法。它是尾部递归的因此所有尾调用优化都是可以完成的。快速排序的缺点其最坏时间复杂度为 On2当枢轴选择不当时就会发生这种情况。对于小型数据集来说它并不是一个好的选择。它不是稳定排序意味着如果两个元素键相同快速排序时它们的相对顺序不会在排序输出中保持因为这里我们根据枢轴的位置交换元素不考虑它们的原始位置。快速排序的应用高效地在内存中排序大型数据集。用于库的排序函数如 C stdsort 和 Java Arrays.sort 用于原语。在数据库中整理记录以加快搜索速度。需要排序输入的算法中的预处理步骤例如二分搜索、两点技术。使用快速选择Quicksort 的一种变体找到第 k 个最小/最大的元素。基于多个键自定义比较器排序对象数组。数据压缩算法如霍夫曼编码预处理。图形学和计算几何例如凸包算法。编程资源 https://pan.quark.cn/s/7f7c83756948 更多资源 https://pan.quark.cn/s/bda57957c548

相关新闻

互联网大厂Java求职面试实录:核心技术与业务场景深度解析

互联网大厂Java求职面试实录:核心技术与业务场景深度解析

互联网大厂Java求职面试实录:核心技术与业务场景深度解析 在互联网大厂的Java求职面试中,技术细节和业务理解同等重要。本文通过一位严肃的面试官与一位搞笑的水货程序员谢飞机的三轮问答,带你深入了解面试中的技术考察与业务场景应用。第一轮…

2026/7/6 1:03:44 阅读更多 →
【个人成长】樊登访谈:创业、读书与成长的底层逻辑

【个人成长】樊登访谈:创业、读书与成长的底层逻辑

樊登访谈:创业、读书与成长的底层逻辑 一、创业初期:反脆弱的生存智慧 1. 艰难但理性的起步 刚到北京时,央视的工资很不稳定——有节目时工资高,没节目时就低。但我是一个反脆弱性比较强的人,会考虑风险考虑得比较多。我觉得万…

2026/7/3 14:45:45 阅读更多 →
潮玩手办订单管理系统的设计实现-开题报告

潮玩手办订单管理系统的设计实现-开题报告

目录 潮玩手办订单管理系统设计背景系统核心功能模块技术实现方案预期创新点应用价值 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 潮玩手办订单管理系统设计背景 潮玩手办市场近年来快速增长&#xf…

2026/7/5 6:39:35 阅读更多 →

最新新闻

深入理解Go语言内存模型与优化

深入理解Go语言内存模型与优化

深入理解Go语言内存模型与优化Go语言以其简洁的语法、强大的并发模型和出色的性能,在现代软件开发中占据了重要地位。然而,要真正释放Go程序的潜力,开发者必须深入理解其内存模型,并掌握相关的优化技巧。Go的内存管理虽然由垃圾回…

2026/7/6 1:05:31 阅读更多 →
松下伺服电子齿轮比计算:从脉冲当量到参数设置的 3 个实战案例

松下伺服电子齿轮比计算:从脉冲当量到参数设置的 3 个实战案例

松下伺服电子齿轮比实战指南:从脉冲当量到参数设置的深度解析在工业自动化领域,伺服系统的精度控制一直是工程师们关注的核心问题。作为松下伺服系统的关键参数之一,电子齿轮比的正确设置直接关系到设备的运动精度和响应速度。本文将从一个全…

2026/7/6 1:05:31 阅读更多 →
V4L2 零拷贝与内存分配机制

V4L2 零拷贝与内存分配机制

在 Linux 嵌入式多媒体与 AI 边缘计算(如 RK3588 平台)中,为了实现极低延迟和降低 CPU 占用,通常需要打通摄像头(Camera)、图像格式转换模块(RGA/GPU)、AI 加速器(NPU&am…

2026/7/6 1:01:30 阅读更多 →
KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC(Know Your Customer,了解你的客户)并非信贷行业的专属课题,而是数字经济时代每一个需要建立"信任关系"的商业场景所共有的核心命题。无论是金融、电商、出行还是短视频,当平台试图确认"站在对面的究…

2026/7/6 1:01:30 阅读更多 →
Agentic Testing实战:自主AI测试代理架构与实现

Agentic Testing实战:自主AI测试代理架构与实现

# Agentic Testing实战:自主AI测试代理架构与实现## 一、背景与挑战:传统测试自动化的天花板当CI/CD流水线每天触发数百次测试执行,当微服务架构的API变更频率以分钟计,传统基于录制回放或关键字驱动的测试框架逐渐暴露出结构性缺…

2026/7/6 1:01:30 阅读更多 →
Windows上的安卓应用安装神器:APK安装器完整指南

Windows上的安卓应用安装神器:APK安装器完整指南

Windows上的安卓应用安装神器:APK安装器完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松安装安卓应用吗?APK安装…

2026/7/6 0:59:29 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻