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

Java算法之快速排序(Quick Sort)

快速排序:分而治之的高效排序算法

简介

快速排序是一种分而治之的排序算法,由C. A. R. Hoare在1960年提出。它通过选取一个元素作为"基准"(pivot),然后重新排列数组,使得所有比基准值小的元素都在基准的左边,所有比基准值大的元素都在基准的右边。这个过程称为分区(partitioning)。之后,递归地对基准左边和右边的子数组进行同样的操作。

算法步骤

  1. 从数组中选择一个元素作为基准。
  2. 重新排列数组,所有比基准小的元素移动到基准的左边,其余的移动到右边。
  3. 对基准左边和右边的子数组递归执行步骤1和2。
  4. 当所有子数组的大小为1或0时,排序完成。

//partition 方法接受数组、起始索引和结束索引作为参数,执行分区操作,并返回基准的索引位置。
//quickSort 方法是递归方法,它调用自身来排序基准左边和右边的子数组。
//main 方法中,我们初始化一个数组,然后调用 quickSort 方法进行排序,并打印排序后的结果。
public class QuickSort {// 快速排序的分区操作private static int partition(int[] arr, int low, int high) {int pivot = arr[high]; // 选择最右侧的元素作为基准int i = (low - 1); // Index of smaller elementfor (int j = low; j < high; j++) {// 如果当前元素小于或等于基准if (arr[j] <= pivot) {i++;// 交换 arr[i] 和 arr[j]int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换 arr[i+1] 和 arr[high] (或基准)int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;}// 快速排序递归方法private static void quickSort(int[] arr, int low, int high) {if (low < high) {// 执行分区操作int pi = partition(arr, low, high);// 分别对左右分区递归排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}}public static void main(String[] args) {int[] arr = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.length - 1);// 打印排序后的数组for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

优点

  • 效率:平均情况下,快速排序的时间复杂度为O(n log n),是最快的排序算法之一。
  • 空间优势:空间复杂度为O(log n),递归实现时需要栈空间。
  • 原地排序:快速排序是原地排序算法,不需要额外的存储空间来创建另一个数组。

缺点

  • 最坏情况:在最坏情况下,时间复杂度退化为O(n^2),特别是当数组已经排序或所有元素相等时。
  • 稳定性:快速排序是不稳定的排序算法,相同的元素可能在排序后改变它们原来的顺序。
  • 递归实现:递归实现可能导致栈溢出,尤其是在数据量很大时。

时间复杂度和空间复杂度分析

  • 时间复杂度:平均情况下为O(n log n),最坏情况下为O(n^2)。
  • 空间复杂度:O(log n),这是递归调用所需的栈空间。

使用场景

  • 快速排序适用于大多数需要排序的场景,特别是数据量较大时。
  • 当数据分布均匀时,快速排序的性能最佳。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AMD Zen 5 微架构及其市场策略
  • 简单排序(sort)
  • Openstack 与 Ceph集群搭建(完结): 配置Ceph作为Openstack后端存储
  • 如何打造基于Java SpringBoot和Vue的医院门诊智能预约平台?四步实现高效就医流程,整合MySQL数据库,优化用户体验。
  • 功能测试常用的测试用例大全
  • C#泛型相关
  • 【最新华为OD机试E卷】boos的收入(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 网易校招面试题 - 如何给 10 台机器安装 Nginx
  • 视频中间件:与海康ISC平台级联
  • RK3588 系列之1—串口连接
  • Leetcode Hot 100刷题记录 -Day6(滑动窗口)
  • Java:路径计算与障碍物处理
  • Web自动化测试实战--博客系统
  • golang本地缓存fastcache高性能实现原理
  • 使用Python查找并移动两个文件夹中不重名的文件
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 分享的文章《人生如棋》
  • [译]前端离线指南(上)
  • 4个实用的微服务测试策略
  • CSS 三角实现
  • iOS | NSProxy
  • Redux系列x:源码分析
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 当SetTimeout遇到了字符串
  • 面试遇到的一些题
  • 排序算法学习笔记
  • 时间复杂度与空间复杂度分析
  • 延迟脚本的方式
  • 移动端 h5开发相关内容总结(三)
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 怎样选择前端框架
  • 最近的计划
  • 阿里云移动端播放器高级功能介绍
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #70结构体案例1(导师,学生,成绩)
  • #php的pecl工具#
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (02)Unity使用在线AI大模型(调用Python)
  • (a /b)*c的值
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (SpringBoot)第二章:Spring创建和使用
  • (第二周)效能测试
  • (动态规划)5. 最长回文子串 java解决
  • (蓝桥杯每日一题)love
  • (数据结构)顺序表的定义
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (转)关于pipe()的详细解析
  • *1 计算机基础和操作系统基础及几大协议
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 中 GetProcess 相关方法的性能
  • .net访问oracle数据库性能问题
  • .NET使用存储过程实现对数据库的增删改查
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [000-01-008].第05节:OpenFeign特性-重试机制
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]