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

快速排序算法详解

算法思想

快速排序是一种高效的排序算法,采用分治策略​(Divide and Conquer)。它的基本思想是:

  1. 选择一个基准元素(pivot)

  2. 将数组分区,使得所有小于基准的元素都在其左侧,所有大于基准的元素都在其右侧

  3. 递归地对左右两个子数组进行快速排序

算法步骤

  1. 选择基准​:从数组中选择一个元素作为基准(pivot)

  2. 分区操作​:重新排列数组,使所有小于基准的元素放在基准前面,所有大于基准的元素放在基准后面

  3. 递归排序​:递归地将上述过程应用于基准左右两侧的子数组

Java实现

public class QuickSort {// 快速排序入口方法public static void quickSort(int[] arr) {if (arr == null || arr.length == 0) {return;}quickSort(arr, 0, arr.length - 1);}// 递归快速排序private static void quickSort(int[] arr, int low, int high) {if (low < high) {// 分区操作,返回基准的索引位置int pivotIndex = partition(arr, low, high);// 递归排序左半部分quickSort(arr, low, pivotIndex - 1);// 递归排序右半部分quickSort(arr, pivotIndex + 1, high);}}// 分区函数private static int partition(int[] arr, int low, int high) {// 选择最右边的元素作为基准int pivot = arr[high];// 小于基准的元素的边界索引int i = low - 1;for (int j = low; j < high; j++) {// 如果当前元素小于或等于基准if (arr[j] <= pivot) {i++;// 交换arr[i]和arr[j]swap(arr, i, j);}}// 将基准元素放到正确位置swap(arr, i + 1, high);return i + 1;}// 交换数组中两个元素的位置private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}// 测试代码public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90};System.out.println("排序前的数组:");printArray(arr);quickSort(arr);System.out.println("排序后的数组:");printArray(arr);}// 打印数组private static void printArray(int[] arr) {for (int value : arr) {System.out.print(value + " ");}System.out.println();}
}

时间复杂度分析

  • 最佳情况​:O(n log n) - 每次分区都能将数组均匀分成两部分

  • 平均情况​:O(n log n)

  • 最坏情况​:O(n²) - 当数组已经有序或逆序,且选择最边缘的元素作为基准时

空间复杂度

  • 平均情况下:O(log n) - 递归调用栈的空间

  • 最坏情况下:O(n) - 需要n层递归调用

优化策略

  1. 随机选择基准​:随机选择基准元素可以避免最坏情况的发生

  2. 三数取中法​:选择第一个、中间和最后一个元素的中值作为基准

  3. 小数组使用插入排序​:当子数组规模较小时(如<10),使用插入排序更高效

  4. 尾递归优化​:减少递归深度

算法特点

  • 不稳定排序​:相等元素的相对位置可能会改变

  • 原地排序​:只需要常数级的额外空间

  • 实践中最快​:尽管最坏情况时间复杂度较高,但在实际应用中通常是最快的排序算法

快速排序因其高效性和实用性,被广泛应用于各种编程语言和系统的排序实现中。

http://www.xdnf.cn/news/19870.html

相关文章:

  • 【mysql】SQL自连接实战:查询温度升高的日期
  • 三维多相机光场扫描:打造元宇宙时代的“数字自我”
  • React学习教程,从入门到精通, React 嵌套组件语法知识点(10)
  • 公司机密视频泄露频发?如何让机密视频只在公司内部播放
  • 数据采集机器人哪家好?2025 年实测推荐:千里聆 RPA 凭什么成企业首选?
  • 机器人智能控制领域技术路线
  • 嵌入式 - 硬件:51单片机(3)uart串口
  • 【Java EE进阶 --- SpringBoot】Spring IoC
  • 鸿蒙:从图库选择图片并上传到服务器
  • 什么情况下会用到ConcurrentSkipListMap
  • 【系统架构设计(15)】软件架构设计一:软件架构概念与基于架构的软件开发
  • PDF Reader 编辑阅读工具(Mac中文)
  • Linux 常用命令全解析:从入门到实战的必备指南
  • TypeScript 增强功能大纲 (相对于 ECMAScript)
  • 如何轻松地将联系人从 Mac 同步到 iPhone
  • SQLmap 完整使用指南:环境搭建 + 命令详解 + 实操案例
  • SQL Server服务管理
  • 处理省市区excel数据加工成SQL
  • 常用的几种测试工具:selenium,jmeter,jenkins
  • 【IO】进程间通信(IPC)练习
  • Unity 的游戏循环机制
  • 66车载诊断架构 --- 从架构系统角度怎么确保整车DTC的完整性?
  • (二)文件管理-基础命令-pwd命令的使用
  • 计算机视觉(六):腐蚀操作
  • 电脑城老板不会告诉你的装机秘籍:建造者模式让你的代码高配起飞!
  • 基于深度学习的医疗器械生产备案凭证识别技术,实现从图像到结构化数据的智能转化
  • pytorch初级
  • 八、算法设计与分析
  • 新后端漏洞(上)- Python unpickle 造成任意命令执行漏洞
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1