快速排序(数据结构)

1. 前言:

这两种排序经常使用,且在算法题中经常遇见。
这里我们简单分析讨论一下。

1. 快速排序

平均时间复杂度:O(nlogn)
最坏时间复杂度: O(n^2)

在这里插入图片描述

1.1. 左右向中遍历:

  1. 取最右侧4为基础元素,取出后,4的位置为null。
  2. 从有空的另一侧开始遍历比较,如果左侧3的元素小于基准元素4,则不变化,反之则把左侧元素交换到右侧,左侧为null。
  3. 然后从右侧开始遍历。
  4. 反复,直到low,high指针相遇。

这种方式易于理解却不便于书写,需要反复判断是向左遍历还是向右遍历。

public class QuickSortVariant {public static void main(String[] args) {int[] arr = {1, 3, 6, 2, 4};quickSort(arr, 0, arr.length - 1);for (int i : arr) {System.out.print(i + " ");}}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);}}public static int partition(int[] arr, int low, int high) {int pivot = arr[high]; // 选择最右侧元素作为基准int left = low;int right = high - 1;while (left < right) {// 从左侧寻找大于基准的元素while (arr[left] <= pivot && left < right) {left++;}// 从右侧寻找小于基准的元素while (arr[right] >= pivot && left < right) {right--;}// 交换左右找到的元素swap(arr, left, right);}// 如果最后左指针指向的元素大于基准,与基准交换if (arr[left] >= pivot) {swap(arr, left, high);} else {left++;}return left; // 返回基准元素的最终位置}public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

1.1. 单侧遍历:

在这里插入图片描述
这种遍历理解麻烦点,书写却简单点。

  1. i 指针指向小于base元素的结尾。这里我指向了数组前的一个元素,这不是错误,而是一个巧妙的设计。
  2. 如果 j 指针指向的元素小于base,则 i 指针扩充一个元素,即i++,然后swap(i,j)一般情况下二者是重合的。
  3. 如果遇见大于base的指针,则j++,i 不变,等效与记录了这个大元素指针的位置,再遇到小的元素可以通过swap(i,j)交换,这时,则真正起作用。
public class Solution {public static void main(String[] args) {int []arr = new int[]{1,3,6,2,4};sort(arr,0,4);System.out.println(Arrays.toString(arr));}public  static void sort(int[]arr,int low, int high){int baseIndex = quickSort(arr,low,high);quickSort(arr,low,baseIndex-1);quickSort(arr,baseIndex + 1,high);}public static int quickSort(int[]arr,int low, int high){int base = arr[high];int i = low - 1;for(int j = low; j < arr.length - 1; j++){if(arr[j] < base){i++;swap(arr,i,j);}}swap(arr,high,i + 1);return i + 1;}public static void swap(int[]arr,int index0, int index1){int tem = arr[index0];arr[index0] = arr[index1];arr[index1] = tem;}}

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

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

相关文章

MiniGPT-5: 通过生成性视觉标记实现交错式视觉与语言生成

MiniGPT-5: Interleaved Vision-And-Language Generation via Generative Vokens 摘要 近年来&#xff0c;大型语言模型(LLM)在自然语言处理(NLP)领域的突破性进展引起了全球AI开发者的关注。这些模型在文本生成和理解方面设定了新的基准。然而&#xff0c;尽管在文本生成方面…

HarmonyOS NEXT应用开发—发布图片评论

介绍 本示例将通过发布图片评论场景&#xff0c;介绍如何使用startAbilityForResult接口拉起相机拍照&#xff0c;并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机&#xff0c;拍照后获取图片地址。 实现思路 创建CommentData类&#…

Linux TCP参数——tcp_abort_on_overflow

tcp_abort_on_overflow 英文翻译理解&#xff1a;溢出中止 所以&#xff0c;溢出指的是什么溢出&#xff1f; Linux中会维护socket全连接队列&#xff0c;所以这里的溢出指的是全连接队列的溢出。 全连接队列是什么&#xff1f; 全连接队列指的就是TCP三次握手中的第三次握手…

腾讯云轻量应用服务器2核4G5M代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

sqllab第29-33通关笔记

29关知识点&#xff1a; 单引号闭合绕过联合注入 payload:id0%27unionselect1,2,database()%271报错注入 id1%27andextractvalue(1,concat(0x7e,database(),0x7e))%271下面就不演示了&#xff0c;上面给出了payload&#xff0c;感觉没有任何过滤信息&#xff0c;那个waf应该是…

嵌入式系统架构设计

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136745118 一. 嵌入式系统硬件 1、传统嵌入式系统主要硬件包括&#xff1a; ● 微处理器&#xff1a;微控制器&#xff08;MCU&#xff09;&#xff0c;微处理器&#xff08;MPU&#xff09; ● 存储器…

HCIA——TCP协议详解

目录 1、TCP概念及协议头部格式 1.1TCP特点 1.2TCP协议协议头部格式 1.3字段进行介绍 1.3.1源端口和目的端口 1.3.2序号(seq) 1.3.3确认序号(ack) 1.3.4数据偏移 1.3.5标志位 1.3.6窗口 1.3.7校验和 1.3.8紧急指针 2、TCP的可靠性 2.1 TCP可靠性的保障 2.2排序机…

Android Studio实现内容丰富的安卓博客发布平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号078 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看博客列表 3.查看博客详情 4.评论博客&#xff0c; 5.…

Winform编程详解十:ListBox 列表框

一、属性介绍 1. (Name) 控件的对象标识符ID 2. Items 控件的数据集合 3. BackColor 控件的背景颜色 4. BorderStyle 控件的边框样式 5. Cursor 鼠标移过该控件显示的光标样式 6. Font 控件的字体样式 7. ForeColor 控件的文本颜色 8. UseWaitCursor 使用鼠标的等待光…

Llama 2: 深入探讨ChatGPT的开源挑战者

Llama 2&#xff1a;开源挑战者深度解析 摘要 本文深入探讨了Llama 2的能力&#xff0c;并提供了在Google Colab上通过Hugging Face和T4 GPU设置这个高性能大型语言模型的详细指南。Llama 2是由Meta与Microsoft合作开发的开源大型语言模型&#xff0c;旨在重新定义生成式人工…

HBase在表操作--显示中文

启动HBase后&#xff0c;Master和RegionServer两个服务器&#xff0c;分别对应进程为HMaster和HRegionServe。&#xff08;可通过jps查看&#xff09; 1.进入表操作 hbase shell 2.查看当前库中存在的表 list 3.查看表中数据&#xff08;注&#xff1a;学习期间可用&#…

RUST egui部署到github

Dist 接上文&#xff0c;当用trunk serve编译部署后&#xff0c;工程目录下就会有一个dist目录&#xff0c;这个目录就是用来部署用的。 &#xff1a;&#xff09; Github repo 创建一个github repo&#xff0c;这个repo的名称有固定格式要求&#xff0c;就是你自己的用户名…

将FastSAM中的TextPrompt迁移到MobileSAM中

本博文简单介绍了SAM、FastSAM与MobileSAM,主要关注于TextPrompt功能的使用。从性能上看MobileSAM是最实用的,但其没有提供TextPrompt功能,故而参考FastSAM中的实现,在MobileSAM中嵌入TextPrompt类。并将TextPrompt能力嵌入到MobileSAM官方项目提供的gradio.py部署代码中,…

【JVM】生产内存占用异常优化 (一)

记录一次 - 内存占用优化 某个导出&#xff0c;导出数据量过大总是导致OOM&#xff0c;但是根据需求&#xff0c;导出数据大小并没有那么大 按照导出数据的查询来看 SELECTg.inventory_code,g.visit_record_code,g.recovery_price AS transactionAmount FROM crm_goods g ...…

「Linux系列」Linux 文件与目录管理

文章目录 一、Linux 文件与目录管理案例 1: 创建文件和目录案例 2: 移动和重命名文件案例 3: 复制文件和目录案例 4: 删除文件和目录案例 5: 查看文件和目录信息案例 6: 更改文件权限案例 7: 创建符号链接案例 8: 查找文件案例 9: 使用通配符创建和删除文件案例 10: 创建具有特…

小迪安全41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

#知识点&#xff1a; 1、XML&XXE-原理&发现&利用&修复等 2、XML&XXE-黑盒模式下的发现与利用 3、XML&XXE-白盒模式下的审计与利用 4、XML&XXE-无回显&伪协议&产生层面 #思路点&#xff1a; 参考&#xff1a;https://www.cnblo…

Linux 块设备驱动

Linux 三大驱动分别是&#xff1a;字符设备驱动、块设备驱动、网络设备驱动。 块设备是针对存储设备的&#xff0c;比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动&#xff0c;块设备驱动相比字符设备驱…

CentOS 7 编译安装 Git

CentOS 7 编译安装 Git 背景来源删除旧版本 Git安装依赖包下载 Git 源代码检验相关依赖&#xff0c;设置安装路径编译安装添加 Git 环境变量重新加载配置文件查看版本号参考文献 背景来源 为什么要安装新版本呢&#xff1f; 因为无聊&#xff0c;哈哈哈&#xff0c;其实也不是…

Linux下进程的调度与切换

&#x1f30e;进程的调度与切换 文章目录&#xff1a; 进程的调度与切换 进程切换 进程调度       活动状态进程队列       位图判断       过期队列 总结 前言&#xff1a; 在Linux操作系统中&#xff0c;进程的调度与切换是操作系统核心功能之一&#xff…

RabbitMq——direct交换器、fanout交换器、 topic交换器

direct交换器: @Configuration =发送= @Bean protected Queue queue(){ Queue queue = new Queue(“myQueue”) return queue; } amqpTemplate.convertAndSend("myQueue","这是发送的内容"); 发送RabbitMq 发送成功 =接收=消费者(新项目)…