Java中的快速排序算法详解

devtools/2024/9/24 11:36:49/

快速排序是一种广泛使用的排序算法,以其高效的性能和简单的实现而闻名。它基于分治法的原理,通过一个基准值(pivot)将数组分为两个子数组,分别对子数组进行排序,最终达到整体排序的目的。本文将详细介绍快速排序算法的思想、Java实现及其性能分析。

一、快速排序的基本思想

快速排序的核心思想是选择一个基准值,将数组分为左右两部分,使得左边的元素都小于基准值,右边的元素都大于基准值。这个过程称为分区(partition)。之后,递归地对左右两个子数组进行排序。

Java_6">二、Java实现

Java中实现快速排序主要包括两个步骤:分区和递归排序。以下是一个简单的快速排序实现示例:

public class QuickSort {public 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[low];int i = low + 1;int j = high;while (i <= j) {// 从左向右找到第一个大于基准值的元素while (i <= j && arr[i] <= pivot) {i++;}// 从右向左找到第一个小于基准值的元素while (i <= j && arr[j] > pivot) {j--;}// 交换两个元素if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 将基准值移到正确的位置arr[low] = arr[j];arr[j] = pivot;return j;}public static void main(String[] args) {int[] arr = {5, 3, 7, 6, 4, 1, 0, 2, 9, 10, 8};quickSort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}
}

三、性能分析

快速排序的时间复杂度平均为 O ( n l o g n ) O(nlogn) O(nlogn),但在最坏情况下会退化到 O ( n 2 ) O(n^2) O(n2)。最坏情况发生在每次分区都选择最大或最小值作为基准值,导致分区后只有一个元素在基准的一侧。为了避免最坏情况的发生,可以选择随机基准值或使用三数中值法(选择左端、右端和中间元素的中值作为基准)。

四、优缺点

优点:

  • 时间复杂度较低,平均情况下为 O ( n l o g n ) O(nlogn) O(nlogn)
  • 原地排序,不需要额外的存储空间。
  • 对于大规模数据的排序效率较高。

缺点:

  • 最坏情况下的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 不是稳定排序算法,即相同元素的相对位置可能会改变。

五、总结

快速排序是一种高效且常用的排序算法,通过合理选择基准值和优化分区操作,可以在大多数情况下获得很好的性能。在实际应用中,快速排序因其简单和高效的特点,被广泛应用于各种排序场景。

全文完!


http://www.ppmy.cn/devtools/116465.html

相关文章

字节面试:Redis为什么要持久化?有几种方式?

文章目录 Redis为什么需要持久化&#xff1f;持久化分类RDB&#xff08;快照snapshot&#xff09;AOF &#xff08;Append Only File&#xff09;AOF VS RDB混合持久化 扩展1&#xff1a;生成RDB快照命令对比扩展2&#xff1a;模拟断电恢复数据扩展3&#xff1a;设置持久化方式…

Spring MVC参数接收 总结

1. 简介 Spring MVC可以简化从前端接收参数的步骤。 2. Param传参 通过设定函数入参和添加标记来简化接受&#xff1a; //参数接收 RequestMapping("product") ResponseBody //接受/product?productgoods&id123 //1.名称必须相同&#xff0c;2.不传值不会不…

使用Python实现深度学习模型:智能宠物监控与管理

在现代家庭中,宠物已经成为许多家庭的重要成员。为了更好地照顾宠物,智能宠物监控与管理系统应运而生。本文将详细介绍如何使用Python实现一个智能宠物监控与管理系统,并结合深度学习模型来提升其功能。 一、准备工作 在开始之前,我们需要准备以下工具和材料: Python环境…

分库分表-分页排序查询

优质博文&#xff1a;IT-BLOG-CN 背景&#xff1a;我们系统上云后&#xff0c;数据根据用户UDL部分数据在国内&#xff0c;部分数据存储在海外&#xff0c;因此需要考虑分库查询的分页排序问题 一、分库后带来的问题 需求根据订单创单时间进行排序分页查询&#xff0c;在单表…

【游戏引擎】C++自制游戏引擎 Lunar Game Engine

Lunar-Game Engine 仓库位置 Lunar Game Engine Lunar GameEngie是几个渣渣业余写的基于C的游戏引擎。 相比于比较成熟的引擎&#xff0c;该引擎的特点如下 结构,标准混乱bug众多根本不能用&#xff01; 最后的最后 To The Moon and Beyond! 简介 Luna Engine基于 C 和…

【AI写代码】使用 ChatGPT 写 ila

给AI的指令&#xff1a; 帮我完成ila 的编写&#xff1b;这是变量&#xff1a; input [31:0] times_cnts ; input [7 :0] rtt_din ; input rtt_din_clk_p ; reg [31:0] sky_time_cnts_1; // 飞机的本地计时器 reg [31:0] sky_time_cnts_2;reg [31:0] sk…

Flowable7.0.1框架严重bug,流程跳转到指定节点导致流程中断

一、Bug描述 使用7.0.1版本的 moveActivityIdsToSingleActivityId 或 moveExecutionsToSingleActivityId实现节点跳转&#xff0c;程序不会报错&#xff0c;但是act_ru_task 没有生成新的任务&#xff0c;导致流程中断&#xff0c;这是相当严重的bug。 经过多次测试&#xff…

Debian安装mysql遇到的问题解决及yum源配置

文章目录 一、安装mysql遇到的问题解决二、Debain系统mysql8.0的安装以及远程连接三、彻底卸载软件四、Python 操作 mysql五、debian软件源source.list文件格式说明1. 第一部分2. 第二部分3. 第三部分4. 第四部分5. 关于源的混用问题6. 按需修改自己的sources.list7. 更新软件包…