【第六篇】Java 基础排序算法:快速排序算法和堆排序
快速排序和堆排序摘要本文详细介绍了两种高效的排序算法——快速排序和堆排序。快速排序采用分治思想通过挖坑分区法实现平均时间复杂度为 O(n log n)堆排序基于完全二叉树的堆结构通过构建大顶堆和交换堆顶元素实现排序时间复杂度稳定为 O(n log n)。两种算法均为原地排序但都不稳定。快速排序(quickSort)算法核心快速排序采用区间首个元素作为基准值利用左右双指针交替移动的挖坑分区思路右指针先向左搜寻小于基准的元素填入左侧坑位再让左指针向右搜寻大于基准的元素填入右侧坑位两指针相遇时将基准放入相遇位置完成分区再通过递归分别对基准值的左右两侧子区间重复分区操作依靠分治思想逐步完成整个数组的升序排序。核心要点基准选取区间最左侧元素作为 pivot把 l 下标位置当成第一个 “坑”暂存 pivot双指针分区右指针 h 向左找小数填左坑左指针 l 向右找大数填右坑交替填坑基准归位l 与 h 相遇时只剩唯一坑位放入 pivot此时左边≤pivot、右边≥pivot递归分治以 pivot 下标分割数组分别递归排序左、右子区间直至区间只剩 1 个元素。算法步骤保存基准值pivot arr[l]循环当l h未相遇① h 往左走找到第一个小于 pivot 的元素填入 l 的坑此时 h 变为新坑② l 往右走找到第一个大于 pivot 的元素填入 h 的坑此时 l 变为新坑l h把 pivot 填入该坑返回当前下标基准最终位置递归处理左段[l, pivot下标-1]、右段[pivot下标1, h]递归终止条件区间l h无需排序直接返回。算法特点时间复杂度(O(nlog n))空间复杂度(O(log n))稳定性不稳定算法相等元素可能会改变相对位置Java语言实现packagecom.lgq.ruankao.practice;importstaticcom.lgq.ruankao.util.ArrUtil.printArr;importstaticcom.lgq.ruankao.util.ArrUtil.swap;/** * author lgq * email * date 2026/8/13 9:35 */publicclassMain3{publicstaticvoidquickSort(int[]arr,intl,inth){if(lh)return;// 获取基准值pivot在序列中分割后的下标(经过一次快速排序后pivot的下标)intpivotIndexpartition(arr,l,h);// 分治思想递归排序左区间quickSort(arr,l,pivotIndex-1);quickSort(arr,pivotIndex1,h);}// 分区函数选取最右边元素作为基准值划分大小区域// 简单说就是选择最右边元素作为基准值进行一趟快速排序最后将pivot值的下标返回privatestaticintpartition(int[]arr,intl,inth){// 选取第一个元素作为基准值intpivotarr[l];while(lh){// 1. 右指针h向左找小于pivot的元素找到就交换l和h指针指向的元素while(lharr[h]pivot){h--;}// 退出while循环表示找到了此时需要将右边的值赋值给左边覆盖掉左边的值arr[l]arr[h];// 2. 左指针l向右寻找大于pivot的数while(lharr[l]pivot){l;}// 找到大于pivot的元素了此时需要将左边的值赋值给右边覆盖掉右边的值arr[h]arr[l];}// 最后当l h时此时就是基准值pivot在一趟快速排序后的最终位置下标了进行赋值即可。arr[l]pivot;// 或者因为此时arr[l] arr[h]// arr[h] pivot;returnl;}// 测试publicstaticvoidmain(String[]args){int[]arr{5,2,9,3,7,6,1,8,4};System.out.println(排序前);printArr(arr);quickSort(arr,0,arr.length-1);System.out.println(排序后);printArr(arr);}}交换和打印函数packagecom.lgq.ruankao.util;/** * author lgq * email * date 2026/8/12 9:34 */publicclassArrUtil{publicstaticvoidprintArr(int[]arr){if(arrnull||arr.length1){return;}for(inti0;iarr.length;i){System.out.print(arr[i] );}System.out.println();}// 交换a和b的值publicstaticvoidswap(int[]arr,inti,intj){inttemparr[i];arr[i]arr[j];arr[j]temp;}}堆排序堆的定义堆是完全二叉树分为两种大顶堆每个父节点值 ≥ 左右子节点值堆顶是整个序列最大值。小顶堆每个父节点值 ≤ 左右子节点值堆顶是整个序列最小值。一般堆排序默认使用大顶堆实现升序排序。算法的核心思想将无序数组构建成大顶堆此时堆顶数组第一个元素是最大值。把堆顶最大值和数组末尾元素交换最大值落到有序末尾。对剩余未排序部分重新调整为大顶堆重复交换堆顶与末尾。不断缩小区间直到整个数组有序。算法特点时间复杂度最好 /最坏 / 平均均为 (O(nlog n))空间复杂度(O(1))原地排序不稳定排序相等元素相对位置会改变数组与堆节点下标关系设父节点下标为i左孩子2*i 1右孩子2*i 2最后一个非叶子节点⌊n/2⌋ - 1n 为数组长度Java语言编程实现packagecom.lgq.ruankao.practice;importstaticcom.lgq.ruankao.util.ArrUtil.printArr;importstaticcom.lgq.ruankao.util.ArrUtil.swap;/** * author lgq * email * date 2026/8/13 15:22 */publicclassMain4{/** * 堆调整维护大顶堆性质 * * param arr 数组 * param n 堆有效长度 * param i 当前父节点下标 */publicstaticvoidheapAdjust(int[]arr,intn,inti){intmaxValueIndexi;// 左右孩子下标intleftIndex2*i1;intrightIndex2*i2;// 判断左节点值更大if(leftIndexnarr[leftIndex]arr[maxValueIndex]){maxValueIndexleftIndex;}// 判断右节点值更大if(rightIndexnarr[rightIndex]arr[maxValueIndex]){maxValueIndexrightIndex;}// 如果最大值不是父节点就交换if(maxValueIndex!i){swap(arr,i,maxValueIndex);// 递归调整受影响的子树heapAdjust(arr,n,maxValueIndex);}}/** * 堆排序主方法升序 */publicstaticvoidheapSort(int[]arr){intnarr.length;if(n1)return;// 构造大顶堆从最后一个非叶子节点开始向前遍历for(intin/2-1;i0;i--){heapAdjust(arr,n,i);}// 逐个取出堆顶最大值放到数组末尾for(intin-1;i0;i--){swap(arr,0,i);// 调整剩余未排序区间,[0, i-1]heapJustify(arr,i,0);}}publicstaticvoidmain(String[]args){// 测试用例1普通乱序数组int[]arr1{12,11,13,5,6,7};System.out.print(排序前);printArr(arr1);heapSort(arr1);System.out.print(排序后);printArr(arr1);System.out.println(------------------------);// // 测试用例2逆序数组// int[] arr2 {9,7,5,3,1};// System.out.print(排序前);// printArr(arr2);// heapSort(arr2);// System.out.print(排序后);// printArr(arr2);// System.out.println(------------------------);//// // 测试用例3存在重复值// int[] arr3 {2,5,3,2,9,5,1};// System.out.print(排序前);// printArr(arr3);// heapSort(arr3);// System.out.print(排序后);// printArr(arr3);}}

相关新闻

AI漫剧智能发布系统|视频号一键上传工具|自动生成成本表与工程图

AI漫剧智能发布系统|视频号一键上传工具|自动生成成本表与工程图

温馨提示:文末有联系方式 一、AI漫剧智能发布系统:让内容分发更智能 告别繁琐重复操作,本工具基于深度学习算法,实现漫剧从本地到平台的全自动发布流程,大幅提升内容上线效率与一致性。 二、专为视频号优化的漫剧上传…

2026/10/9 8:46:14 阅读更多 →
Pell数列递推算法详解:从递归到矩阵快速幂的优化之路

Pell数列递推算法详解:从递归到矩阵快速幂的优化之路

1. 项目概述:从一道经典递推题说起 最近在辅导一些刚接触信息学竞赛的同学,发现很多人在面对递推类题目时,总是习惯性地先想“有没有公式”,而不是去理解问题本身的递推关系。这让我想起了OpenJudge上那道经典的 Pell数列 题&am…

2026/10/14 20:49:52 阅读更多 →
装不了微信客户端?wechat-need-web 让微信网页版在浏览器里重新登录

装不了微信客户端?wechat-need-web 让微信网页版在浏览器里重新登录

装不了微信客户端?wechat-need-web 让微信网页版在浏览器里重新登录 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web wechat-need-web 是一…

2026/10/7 7:29:34 阅读更多 →

最新新闻

yolov8-face 核心算子全解析:NMS、边界框格式转换与掩码处理的源码级指南

yolov8-face 核心算子全解析:NMS、边界框格式转换与掩码处理的源码级指南

人工智能计算机视觉深度学习 【免费下载链接】yolov8-face yolov8 face detection with landmark 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8-face 点击查看 免费下载 本文是 ops.md 参考文档的深度展开,以 ultralytics/yolo/utils/ops.py 为…

2026/10/14 20:49:14 阅读更多 →
自学嵌入式第二天(C语言篇——数据类型)

自学嵌入式第二天(C语言篇——数据类型)

琐碎的敲代码内功。(以为很简单 ,结果全是坑)1.C语言提供的数据类型2.整数类型常量:在程序运行过程中,其值不能被改变的量变量:在程序运行过程中,其值能被改变的量(1)整型…

2026/10/14 20:49:14 阅读更多 →
openJiuwen 记忆引擎基础模型:MemInfo 单条记忆信息结构全解

openJiuwen 记忆引擎基础模型:MemInfo 单条记忆信息结构全解

人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习 【免费下载链接】agent-core-java openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。 项目地址: https://gitco…

2026/10/14 20:49:14 阅读更多 →
模拟退火求解二维装箱问题:原理、实现与工程调优

模拟退火求解二维装箱问题:原理、实现与工程调优

模拟退火算法求解装箱问题,我第一次真正上手,是在一个托盘排样项目里。需求方只说了一句话:把尺寸不一的纸箱尽量多地放进托盘,允许90度旋转,不许压坏。我当时觉得,这就是矩形排样,先求个面积下…

2026/10/14 20:49:14 阅读更多 →
51单片机DHT11温湿度采集实战:从仿真到实物的完整拆解

51单片机DHT11温湿度采集实战:从仿真到实物的完整拆解

简介:一套以51单片机为核心的温湿度采集监控完整工程,面向电子爱好者、嵌入式初学者及课程设计学生。资料基于Keil平台,由C语言编写,实现温湿度采集(SHT10传感器)、日历时钟(DS1302)…

2026/10/14 20:49:14 阅读更多 →
Towards Automated Regulatory Compliance Verification in Financial Auditing with Large Language Mo...

Towards Automated Regulatory Compliance Verification in Financial Auditing with Large Language Mo...

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现财务审计中监管合规性的自动验证,旨在解决传统审计中人工验证合规性的低效问题。研究对比了开源LLMs(如Llama-2系列)与专有LLMs(如OpenAI的GPT系列)在合规性检测中的性能,使用了普华永道(PwC)提供的两个自定义…

2026/10/14 20:48:13 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →