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

news/2024/9/19 0:40:45/ 标签: 算法, java, 数据结构

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

简介

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

算法步骤

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

java">//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),这是递归调用所需的栈空间。

使用场景

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

http://www.ppmy.cn/news/1519791.html

相关文章

【软考】【多媒体应用设计师】媒体与技术

1. 多媒体技术改变了传统循序式模式&#xff0c;用户可以借助超文本链接等方式&#xff0c;更自由灵活地访问所需的信息&#xff0c;体现了其&#xff08; &#xff09;的特点。 A.控制性 B.非线性 C.集成性 D.实时性 答案解析&#xff1a;本题考查信息多媒体非线性特点。多媒体…

安防监控/软硬一体/视频汇聚网关EasyCVR硬件启动崩溃是什么原因?

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、WS-FMP4、HTTP-…

vue part 5

生命周期 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>引出生命周期</title><!-- 引入Vue --><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quo…

进程、线程的区别

进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中的基本概念&#xff0c;它们在资源管理和任务执行方面有着本质的区别&#xff1a; 定义&#xff1a; 进程&#xff1a;进程是操作系统进行资源分配和调度的一个独立单位。每个进程都有自己…

ArcGIS Pro 3.1下载分享

在使用了很长一段时间ArcGIS Pro 3.0之后&#xff0c;终于迎来了ArcGIS Pro 3.1的更新&#xff0c;这里为你分享一下ArcGIS Pro 3.1的安装步骤。 软件介绍 ArcGIS Pro 3.1 是由Esri发布的地理信息系统 (GIS) 软件的较新版本&#xff0c;作为 ArcGIS 桌面应用程序家族中的核心…

【递归深搜之记忆化搜索算法】

1. 斐波那契数 解法一&#xff1a;递归 class Solution { public:int fib(int n) {return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return dfs(n - 1) dfs(n - 2);} }; 解法二&#xff1a;记忆化搜索 class Solution {int nums[31]; // 备忘录 public:int fib(int …

使用C++,仿照string类,实现myString

类由结构体演化而来&#xff0c;只需要将struct改成关键字class&#xff0c;就定义了一个类 C中类和结构体的区别&#xff1a;默认的权限不同&#xff0c;结构体中默认权限为public&#xff0c;类中默认权限为private 默认的继承方式不同&#xff0c;结构体的默认继承方式为p…

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置&#xff0c;常用于微小化、高精密度化的机械设备中&#xff0c;如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table&#xff0c;以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…

单窗口IP代理设置指南:轻松搞定

在现代互联网生活中&#xff0c;IP代理已经成为了许多人日常上网的必备工具。单窗口IP代理是一种非常实用的代理方式&#xff0c;它允许你在同一个浏览器中为不同的窗口设置不同的IP地址&#xff0c;从而更好地保护隐私和实现多任务处理。今天&#xff0c;我们就来详细讲解一下…

在 macOS 上升级 Ruby 版本的几种方法

在 macOS 上升级 Ruby 版本通常有几种方法&#xff0c;以下是一些常用的方法&#xff1a; 使用系统自带的 Ruby: macOS 系统自带 Ruby&#xff0c;但通常不是最新版本。可以通过终端使用 softwareupdate 命令来更新系统自带的 Ruby。 使用 Homebrew: Homebrew 是 macOS 的包管…

字符串地指针表示方式

每日诗词&#xff1a; 人生自是有情痴&#xff0c;此恨不关风与月。 ——玉楼春尊前拟把归期说 【宋】欧阳修 目录 数组本身的值和数组储存的值一样吗 char[]和cahr*的区别 1. 类型 2. 内存分配 3. 使用方式 4. 字符串字面量 实例 变式 总结&#xff1a; 下期预告&a…

vue2+countup.js实现大屏数字滚动效果封装

很多大屏、官网或者展示类页面会用到数字跳动更新效果的需求&#xff0c;countup用起来就非常方便 一、官网 CountUp.js 二、效果图 三、安装countup与引入 npm install countup 进行安装依赖 import { CountUp } from countUp.js;//需要用到的页面引入&#xff0c;也可以…

生成式AI:创造性智能的新纪元

引言 随着人工智能技术的飞速发展&#xff0c;生成式AI&#xff08;Generative AI&#xff09;已经成为一个引人注目的领域。它不仅仅是模仿人类行为&#xff0c;而是通过学习大量的数据&#xff0c;创造出全新的内容&#xff0c;如文本、图像、音乐等。本文将探讨生成式AI的基…

同样128个内核,AMD霄龙9755性能翻倍:Zen 5架构下的性能飞跃

近日&#xff0c;AMD在服务器处理器领域再次展示了其强大的技术实力&#xff0c;随着AMD EPYC“Turin”处理器发布日期的临近&#xff0c;其基准测试结果也开始浮出水面。硬件爱好者博主9550pro近期分享了AMD 128核EPYC 9755“Turin”处理器在7zip压缩/解压缩基准测试中的跑分数…

力扣(可被三整除的最大和)

1262. 可被三整除的最大和 提示 给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素 最大和。 思路&#xff1a; 方法一&#xff1a;利用一个长度为3的数组&#xff0c;分别保存0到i内余数为0&#xff0c;1&#xff0c;2的最大和&#xff0c;这样对于一个进入…

通过 NestJS 实现与第三方接口的文件流无缝对接

引言 在当今的Web应用中&#xff0c;高效的文件上传至关重要。本文将介绍如何从前端页面调用NestJS提供的文件上传接口&#xff0c;并通过该接口将文件流直接上传至第三方服务&#xff0c;以此提升上传效率和用户体验。通过这一流程&#xff0c;我们将展示如何利用NestJS与外部…

Java泛型基础概念

Java 泛型是 Java SE 5 引入的一种特性&#xff0c;允许在编写代码时指定类、接口或方法的类型参数。通过泛型&#xff0c;你可以编写更具通用性、类型安全的代码&#xff0c;避免在运行时遇到不必要的类型转换错误。 1. 泛型的基本语法 泛型的基本形式如下&#xff1a; cla…

PHP房屋出售出租多端多平台预约系统小程序源码

&#x1f3e0;&#x1f511;「房屋出售出租多端运营系统」——房产管理新纪元&#xff0c;一键掌控所有&#xff01;&#x1f680; &#x1f3e1; 开篇直击&#xff1a;房产市场新利器&#xff0c;轻松管理不再是梦&#xff01; 亲们&#xff0c;还在为房屋出售或出租的繁琐流…

qt父类和子类转换的安全性问题

在 Qt 中&#xff0c;父类和子类之间的转换遵循 C 的类型转换规则。以下是关于父类和子类转换安全性的详细说明&#xff1a; 1. 向上转型&#xff08;Upcasting&#xff09; 定义&#xff1a;将子类对象转换为父类对象。安全性&#xff1a;这是安全的&#xff0c;因为子类对象…

C# 自动化抢购脚本:基于商品链接的实现方案

实现思路&#xff1a; 启动参数: options.AddArgument("start-maximized"); 用于启动浏览器时使其窗口最大化。 创建 EdgeDriver 实例: EdgeDriver driver new EdgeDriver(options); 用于初始化 WebDriver 实例。导航到 URL: driver.Navigate().GoToUrl("请输入…