排序系列 之 快速排序
- !!!排序仅针对于数组哦
- 本次排序是按照升序来的哦
- 代码后边有图解哦
介绍
- 快速排序英文名为Quick Sort
基本思路
- 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素base,利用base将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列
代码
<!----java----->
import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr = {7,2,3,6,1,5,4}; // 待排序数组sort(arr,0, arr.length-1); // 方法调用,left和right为带排序数组的起始位置和最终位置,所以right=arr.length-1System.out.println(Arrays.toString(arr));}public static void sort(int[] arr,int left,int right){if(left>=right){return;} // 判断带排序数组的长度,严格的左边游标要不大于右边游标int base = arr[left]; // 定义基准数int i = left; // 定义左边的游标。这里不用left,是因为left位置为基准数,基准数不能变int j = right; // 定义右边的游标。这里不用right,是因为后续递归的时候需要一个参数while(i!=j){ // 循环走起,当i和j相遇时,跟基准数交换。不相遇时,i位置大于基准数,j位置小于基准数时,i位置和j位置的数交换/** 思考下,为啥这里先是j在i前边??? */while(arr[j]>=base && i<j){j--;} // 循环停止,说明j指向的数值要比基准数小。降序为<= while(arr[i]<=base && i<j){i++;} // 循环停止,说明i指向的数值要比基准数大。降序为>= /** 【公布问题答案啦】* 因为j停下的时候代表当前数比基准数小,i停下是当前数比基准数大。我们此次排序是升序,相遇数要和基准数交换,所以需要保证相遇数一定要小于基准数*/// 本次排序为升序,即需要找到一个位置,这个位置的左边都是比基准数小的,右边都是比基准数大的int temp = arr[i]; // i比基准数大,j比基准数小,交换。交换完成后,i和j不等,两个游标继续前走或后走arr[i] = arr[j];arr[j] = temp;}// i和j相遇,i也行j也行,因为都指向一个嘛,跟基准数交换。然后对基准数左右两遍递归arr[left] = arr[i];arr[i] = base;sort(arr,left,i-1);sort(arr,i+1,right);}
}<!------------------------>
运行结果;
[1, 2, 3, 4, 5, 6, 7]
<!----python----->
def quickSort(arr, left, right):if left >= right:return arr;base = arr[left];i, j = left, right;while i != j:while arr[j] >= base and i < j:j -= 1while arr[i] <= base and i < j:i += 1arr[j], arr[i] = arr[i], arr[j];arr[i], arr[left] = arr[left], arr[i];quickSort(arr,left,i-1);quickSort(arr,i+1,right);return arrarr = [7,2,3,6,1,5,4]
print(quickSort(arr, 0, len(arr) - 1))
<!------------------------>
运行结果;
[1, 2, 3, 4, 5, 6, 7]
代码思路及流程图(直接上图,不清楚可以对照代码看哦)

复杂度
- 时间复杂度:最好和平均情况下为O(n log n),最坏情况下为O(n^2)。
- 空间复杂度:最好情况下为O(log n),最坏情况下为O(n),额外空间为O(1)。
(复杂度先记住吧,等后续研究彻底了,会再写篇文章的) - 它是非稳定排序
扩展一下
Python的一个更简单的方法
# 该方法不适用java哦
def quickSort(arr):if len(arr)<2:return arr;base=arr[0];left = [x for x in arr if x<base];middle = [x for x in arr if x==base];right = [x for x in arr if x>base];return quickSort(left)+middle+quickSort(right);arr=[7,2,3,6,1,5,4];
print(quickSort(arr)) # [1, 2, 3, 4, 5, 6, 7]
巩固一下
给定一个数组,用上述方法进行排序,流程是不是跟下图一样呢?
int[] arr = {3,7,1,6,2,5,4}

文章推荐
- 实在是不会做动画,如果还看不懂,可以移步这里:
十大经典排序算法
【漫画】不要再问我快速排序了 - 有错误请指正,谢谢各位~
相关文章:
排序系列 之 快速排序
!!!排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素base,利用base将待排序的序列分…...
【银河麒麟服务器操作系统】java进程oom现象分析及处理建议
了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区:https://product.kylinos.cn 现象描述 某服务器系统升级内核至4.19.90-25.22.v2101版本后仍会触发oom导致java进程被kill。 现象分析 oom现象分析 系统messages日志分析,故…...
Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)
文章目录 缓冲AOF 策略(append only file)AOF 的工作流程AOF 缓冲区策略AOF 的重写机制重写完的AOF文件为什么可以变小?AOF 重写流程 缓冲AOF 策略(append only file) AOF 的核心思路是 “实时备份“,只要我添加了新的数据或者更新了新的数据࿰…...
共享模型之无锁
一、问题提出 1.1 需求描述 有如下的需求,需要保证 account.withdraw() 取款方法的线程安全,代码如下: interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程…...
下载安装VSCode并添加插件作为仓颉编程入门编辑器
VSCode下载地址:下载 Visual Studio Code - Mac、Linux、Windows 插件下载:GitCode - 全球开发者的开源社区,开源代码托管平台 仓颉社区中下载解压 cangjie.vsix 插件 打开VSCode 按 Ctrl Shift X 弹出下图 按照上图步骤依次点击选中我们下…...
解决:Linux上SVN 1.12版本以上无法直接存储明文密码
问题:今天在Linux机器上安装了SVN,作为客户端使用,首次执行SVN相关操作,输入账号密码信息后,后面再执行SVN相关操作(比如"svn update")还是每次都需要输入密码。 回想以前在首次输入…...
Mongodb多键索引中索引边界的混合
学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…...
如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控
其实这篇文章没必要存在,教程太多了 参考博客(1 2 3),如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 (1) 建议下载PuTTy for windows,从而建立与远程服务器的SSH连接 需要确认目标服…...
如何定位Milvus性能瓶颈并优化
假设您拥有一台强大的计算机系统或一个应用,用于快速执行各种任务。但是,系统中有一个组件的速度跟不上其他部分,这个性能不佳的组件拉低了系统的整体性能,成为了整个系统的瓶颈。在软件领域中,瓶颈是指整个路径中吞吐…...
阿里云服务器 篇三:提交搜索引擎收录
文章目录 系列文章推荐:为网站注册域名判断网站是否已被搜索引擎收录主动提交搜索引擎收录未查询到收录结果时,根据提示进行提交网站提交网站时一般需要登录账号主动提交网站可缩短爬虫发现网站链接时间,但不保证一定能够收录所提交的网站百度提交地址360搜索提交地址搜狗提…...
powe bi界面认识及矩阵表基本操作 - 1
powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充:修改高度2.5 列宽:设置列的宽度…...
SpringBoot 项目 pom.xml 中 设置 Docker Maven 插件
在Spring Boot项目中,使用Docker Maven插件(通常是docker-maven-plugin或者fabric8io/docker-maven-plugin)来自动化构建Docker镜像并将其推送到远程仓库。 这里分别介绍这两种插件的基本配置,并说明如何设置远程仓库推送。 1、…...
k8s二次开发-kubebuiler一键式生成deployment,svc,ingress
一 Kubebuilder环境搭建 注:必须在当前的K8S集群有 nginx这个ingressclass rootk8s:~# kubectl get ingressclass NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx <none> 19h1.1 下载kubebuilder wget https://gi…...
Flutter 状态管理新境界:多Provider并行驱动UI
前言 在上一篇文章中,我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中,使用 Provider 管理多个不同的状态时,你可以为每个状态创建一个单独的 ChangeNotifierProvider…...
标识符和关键字的区别是什么,常用的关键字有哪些?自增自减运算符,移位运算符continue、break、return的区别是什么?
标识符和关键字的区别是什么,常用的关键字有哪些? 标识符标识符就是当我们给变量,方法,类命名时候的名字,而被赋予特殊含义的标识符就是关键字。例如生活中,当我们需要开一家店时候,我们不能将…...
在VS Code上搭建Vue项目教程(Vue-cli 脚手架)
1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…...
Docker 和 k8s 之间是什么关系?
Docker 简介 Docker 功能: Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker,可以将程序及其依赖环境打包,确保在不同操作系统上一致的运行效果。 环境一致性问题: 程序依赖于特定的环境,不同操作系统…...
敲详细的springframework-amqp-rabbit源码解析
看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开,springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念,这两个概念不注意区分容易混淆。…...
Telegram Bot、小程序开发(三)Mini Apps小程序
文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...
5步高效配置OpenCode:打造你的AI编程助手完整指南
5步高效配置OpenCode:打造你的AI编程助手完整指南 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手,模型灵活可选,可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 还在为复杂的AI编程工具配…...
3D Slicer隐藏技巧:这样玩转医学影像分割与3D建模(含DICOM处理)
3D Slicer隐藏技巧:这样玩转医学影像分割与3D建模(含DICOM处理) 在医学影像分析和三维建模领域,3D Slicer作为一款开源工具已经赢得了专业用户的广泛认可。但对于那些已经掌握基础操作的用户来说,如何真正发挥这款软件…...
新概念英语第一册083_Going on holiday
Lesson 83: Going on holiday Watch the story and answer the question Where did Sam go for his holiday this year? He stayed at home.Key words and expressions mess n. 杂乱,pack v. 包装,打包,装箱suitcase …...
SSRF漏洞实战:用Pikachu靶场玩转curl_exec和file_get_contents攻击链
SSRF漏洞攻防实战:从Pikachu靶场到企业级防御体系 当你在浏览器地址栏输入?urlfile:///etc/passwd并成功读取系统文件时,服务器就像一位过于热心的管家,将保险柜钥匙交给了陌生人。这就是SSRF(Server-Side Request Forgery&#…...
别再让PB级大表拖垮你的GaussDB集群了!手把手教你6个实战优化技巧
别再让PB级大表拖垮你的GaussDB集群了!手把手教你6个实战优化技巧 凌晨3点,监控告警突然响起——某个周期性跑数任务已经卡在"执行中"状态超过6小时。你打开集群监控面板,发现CPU使用率飙升至95%,内存占用触达红线&…...
选型指南:74HC14、74LVC14、CD40106...这么多施密特非门,你的项目到底该用哪一款?
施密特触发器选型实战:从74HC14到CD40106的工程决策指南 在数字电路设计中,施密特触发器就像一位经验丰富的守门员,能够有效过滤信号噪声并确保数字系统的稳定运行。但当你打开元器件采购平台,面对74HC14、74LVC14、CD40106等数十…...
SmallThinker-3B快速上手:Postman调用Ollama API实现批量COT推理测试
SmallThinker-3B快速上手:Postman调用Ollama API实现批量COT推理测试 1. 环境准备与模型部署 在开始使用SmallThinker-3B模型进行批量推理测试之前,我们需要先完成基础环境的搭建。 1.1 安装Ollama框架 Ollama是一个轻量级的模型部署框架,…...
提升工作效率:用快马ai生成一键切换win11右键菜单至win10的高效配置脚本
今天想和大家分享一个提升工作效率的小技巧——如何快速将Win11的右键菜单改回Win10的经典布局。作为一个经常需要切换系统环境的开发者,我发现Win11的右键菜单虽然美观,但操作效率反而降低了,特别是需要频繁使用右键功能时。下面记录下我的解…...
5个智能诊断技巧:如何快速定位开源项目性能瓶颈?
5个智能诊断技巧:如何快速定位开源项目性能瓶颈? 【免费下载链接】klipper Klipper is a 3d-printer firmware 项目地址: https://gitcode.com/GitHub_Trending/kl/klipper 当我们面对开源项目的性能问题时,往往陷入"重启大法&qu…...
材料科学家的终极神器:pymatgen完整指南与实战应用
材料科学家的终极神器:pymatgen完整指南与实战应用 【免费下载链接】pymatgen Python Materials Genomics (pymatgen) is a robust materials analysis code that defines classes for structures and molecules with support for many electronic structure codes.…...
