【基础3】快速排序

核心思路

快速排序是Java中Arrays.sort()的实现原理,采用分治策略,通过选择基准元素,将数组分为两个子数组,使得左边元素 ≤ 基准元素 ≤ 右边元素,然后递归排序子数组。

举个简单的例子,图书管理员需要按照书本厚度对一箱书进行排序,使用快速排序就是先选择一本书作为中间基准,把厚的书放在它右边,薄的书放在它左边。(这里左右两边内部是无序的)

处理完后再对它左边的书分别快速排序(即选出新的基准元素,厚的放右边,薄的放左边),同理右边也是一样,最后就得到完整的序列。

复杂度
情况时间复杂度空间复杂度
最好情况O(n logn)O(logn)
最坏情况O(n²)O(n)
平均情况O(n logn)O(logn)
优缺点

优点

  1. 平均情况下最快的比较排序算法
  2. 原地排序(不需要额外内存)
  3. 高度可优化

缺点

  1. 最坏情况时间复杂度较高
  2. 不稳定排序
  3. 递归实现需要栈空间

适用场景

  • 大规模数据排序
  • 需要高效率的通用排序
  • 内存受限环境
代码实现(Java)
public class QuickSort {public static void main(String[] args) {int[] arr = {5, 3, 8, 4, 2};quickSort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr)); }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[high]; //小元素区间的左边界int i = low - 1;       //i+1实际上就是最后基准元素要被移到的位置for (int j = low; j < high; j++) {//把小于基准的元素不断向左靠拢(比基准大的元素也被动地向右边移动),//最后[low,i]的元素都比基准小,那么i+1的位置自然就留给基准元素了if (arr[j] <= pivot) {i++;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;}
}
排序过程

初始数组:[5, 3, 8, 4, 2]

第1次分区(pivot=2)

移动元素:5>2,3>2,8>2,4>2 → 无交换  
最终交换基准 → [2, 3, 8, 4, 5]
返回位置0

递归左半部(空数组)和右半部[3,8,4,5]

第2次分区(pivot=5)

排序数组:[3,8,4,5]  
移动元素:3<5,8>5,4<5 → 交换8和4  
最终数组:[3,4,5,8]  
返回位置2

递归处理左右子数组

左半部[3,4] → 最终排序[3,4]  
右半部[8] → 保持原样

最终结果

[2, 3, 4, 5, 8]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求 0、界面预览00、简介1、编译安装1.1 编辑模块配置文件 2、使用2.1 拨号规则GET 请求POST 请求JSON 数据 2.2 Lua 脚本GET 请求POST 请求JSON 数据 3 、示例3.1 示例 1&#xff1a;提交 CDR 到第三方接口3.2 示例 2…

Linux 开发工具

linux中&#xff0c;常见的软件安装方式---下载 yum/apt.rpm安装包安装源码安装 yum 查看软件包 通过yumlist命令可以罗列出当前⼀共有哪些软件包.由于包的数⽬可能⾮常之多,这⾥我们需要使⽤ grep 命令只筛选出我们关注的包.例如: # Centos $ yum list | grep lrzsz lr…

Agent革命:Manus如何用工作流拆解掀起AI生产力革命

一、现象级产品的诞生背景 2025年3月6日&#xff0c;一款名为Manus的AI产品在技术圈引发地震式传播。其官方测试数据显示&#xff1a;在GAIA基准测试中&#xff0c;基础任务准确率达86.5%&#xff08;接近人类水平&#xff09;&#xff0c;中高级任务完成率突破57%。这标志着A…

Linux13-TCP\HTTP

一、TCP粘包问题 1.TCP在接受数据时,多包数据粘在一起 2.原因: 2.1TCP发送数据时,会根据缓冲区数据的情况进行重新组包 2.2TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数据缓存。 3.如何解决 3.1发指定大小字节 将要发数据,封装在结构体里 struct data { …

网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析

在网络安全日益重要的今天&#xff0c;各国纷纷出台相关政策法规&#xff0c;以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0&#xff0c;分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…

oracle通过dmp导入数据

1、创建用户&#xff0c;并赋予sysdba权限 登录sysdba用户 sqlplus / as sysdba 赋予sysdba权限 grant sysdba to your_user; 2、导入dmp文件 imp target_user/passwordip:port/SERVER_NAME fromusersource_user tousertarget_user fileyour.dmp logdmp_file.log statist…

MySQL 面试篇

MySQL相关面试题 定位慢查询 **面试官&#xff1a;**MySQL中&#xff0c;如何定位慢查询? 我们当时做压测的时候有的接口非常的慢&#xff0c;接口的响应时间超过了2秒以上&#xff0c;因为我们当时的系统部署了运维的监控系统Skywalking &#xff0c;在展示的报表中可以看到…

MyBatis 操作数据库

目录 1、MyBatis 是什么2、配置 MyBatis 开发环境2.1、添加 MyBatis 框架支持2.1.1、老项目添加 MyBatis2.1.2、新项目添加 MyBatis 2.2、配置数据库连接字符串2.3、配置 MyBatis 中的 XML 路径 3、添加业务代码3.1、添加实体类3.2、添加 mapper 接口3.3、添加 xml 文件3.4、添…

uniapp使用蓝牙,usb,局域网,打印机打印

使用流程&#xff08;支持安卓和iOS&#xff09; 引入SDK 引入原生插件包地址如下 https://github.com/oldfive20250214/UniPrinterDemo 连接设备 安卓支持经典蓝牙、ble蓝牙、usb、局域网&#xff08;参考API&#xff09; iOS支持ble蓝牙、局域网&#xff08;参考API&…

Jmeter进行http接口测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要针对http接口进行测试&#xff0c;使用 jmeter工具实现。 Jmeter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较…

力扣35.搜索插入位置-二分查找

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 初始化左右指针left, right 0, len(nums) - 1# 当左指针小于等于右指针时&#xff0c;继续循环while left < right:# 计算中间位置mid (left right) // 2# 如果中间元素等于目标值&…

为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心

本篇继续讨论 通用编程语言。 说明&#xff1a;本阶段的所有讨论都是围绕这一主题展开的&#xff0c;但前面的讨论分成了三个大部分&#xff08;后面列出了这一段的讨论题目的归属关系&#xff09;-区别distinguish&#xff08;各别&#xff09;&#xff1a; 文化和习俗。知识…

PPT 技能:巧用 “节” 功能,让演示文稿更有序

在制作PPT时&#xff0c;你是否遇到过这样的情况&#xff1a;幻灯片越来越多&#xff0c;内容越来越杂&#xff0c;找某一页内容时翻得眼花缭乱&#xff1f;尤其是在处理大型PPT文件时&#xff0c;如果没有合理的结构&#xff0c;编辑和调整都会变得非常麻烦。这时候&#xff0…

刘火良 FreeRTOS内核实现与应用之1——列表学习

重要数据 节点的命名都以_ITEM后缀进行&#xff0c;链表取消了后缀&#xff0c;直接LIST 普通的节点数据类型 /* 节点结构体定义 */ struct xLIST_ITEM { TickType_t xItemValue; /* 辅助值&#xff0c;用于帮助节点做顺序排列 */ struct xLIST_I…

Uniapp项目运行到微信小程序、H5、APP等多个平台教程

摘要&#xff1a;Uniapp作为一款基于Vue.js的跨平台开发框架&#xff0c;支持“一次开发&#xff0c;多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台&#xff0c;并解析常见问题。 一、环境准备 在开始前&#xff0c;请确保已安装以下工具…

100天精通Python(爬虫篇)——第115天:爬虫在线小工具_Curl转python爬虫代码工具(快速构建初始爬虫代码)

文章目录 一、curl是什么&#xff1f;二、爬虫在线小工具&#xff08;牛逼puls&#xff09;三、实战操作 一、curl是什么&#xff1f; 基本概念&#xff1a;curl 支持多种协议&#xff0c;如 HTTP、HTTPS、FTP、SFTP 等&#xff0c;可用于从服务器获取数据或向服务器发送数据&a…

[内网安全] Windows 域认证 — Kerberos 协议认证

&#x1f31f;想系统化学习内网渗透&#xff1f;看看这个&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Kerberos 协议简介 Kerberos 是一种网络认证协议&#xff0c;其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…

PyTorch中的损失函数:F.nll_loss 与 nn.CrossEntropyLoss

文章目录 背景介绍F.nll_loss什么是负对数似然损失&#xff1f;应用场景 nn.CrossEntropyLoss简化工作流程内部机制 区别与联系 背景介绍 无论是图像分类、文本分类还是其他类型的分类任务&#xff0c;交叉熵损失&#xff08;Cross Entropy Loss&#xff09;都是最常用的一种损…

案例1_3:流水灯

文章目录 文章介绍原理图&#xff08;同案例1_2&#xff09;代码效果图 文章介绍 原理图&#xff08;同案例1_2&#xff09; 代码 #include <reg51.h> // 包含头文件void delay(unsigned int time) {unsigned int i, j;for (i 0; i < time; i)for (j 0; j < 1…

基于物联网技术的电动车防盗系统设计(论文+源码)

1总体设计 本课题为基于物联网技术的电动车防盗系统&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;其采用STM32F103单片机为控制器&#xff0c;通过NEO-6M实现GPS定位功能&#xff0c;通过红外传感器检测电瓶是否离开位&#xff0c;通过Air202 NBIOT模块将当前的数…