排序系列 之 快速排序

  • !!!排序仅针对于数组哦
  • 本次排序是按照升序来的哦
  • 代码后边有图解哦

介绍

  • 快速排序英文名为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}
在这里插入图片描述

文章推荐

  • 实在是不会做动画,如果还看不懂,可以移步这里:
    十大经典排序算法
    【漫画】不要再问我快速排序了
  • 有错误请指正,谢谢各位~

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Spring纯注解开发

前言 Spring3.0引入了纯注解开发的模式&#xff0c;框架的诞生是为了简化开发&#xff0c;那注解开发就是简化再简化。Spring的特性在整合MyBatis方面体现的淋漓尽致哦 一.注解开发 以前跟老韩学习SE时他就说&#xff1a;注解本质是一个继承了Annotation 的特殊接口,其具体实…

Unity免费领7月开发者周冰雪世界着色器环境包180种冰材质544种预制变体冰天雪地环境效果限时免费领取20240719

7月19号的Unity开发者周限时免费资产更新啦&#xff0c;这次是冰雪材质和环境素材包&#xff0c;质量挺不错。 之前进过捆绑包&#xff0c; 结帐时输入NATUREMANUFACTURE2024优惠券代码即可免费获得。无需购买。 Unity免费领7月开发者周冰雪世界着色器环境包180种冰材质544种…

DevExpress WinForms自动表单布局,创建高度可定制用户体验(一)

使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验&#xff0c;从自动安排UI控件到按比例调整大小&#xff0c;DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&a…

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划&#xff08;ERP&#xff09; 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理&#xff08;计划&#xff09;3.7.2.3 经营计划&#xff08;生产计划大纲&#xff09;3.7.2.4 …

【人工智能大模型】文心一言介绍以及基本使用指令

目录 一、产品背景与技术基础 二、主要功能与特点 基本用法 指令的使用 注意事项 文心一言&#xff08;ERNIE Bot&#xff09;是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍&#xff1a; 一、产品背景与技术基础 技术背景&#xff1a;百度…

初学Linux之常见指令(上)

初学Linux之常见指令&#xff08;上&#xff09; 文章目录 初学Linux之常见指令&#xff08;上&#xff09;1. Linux下的小技巧热键man 指令 2. ls 指令3. pwd 指令4. cd 指令5. tree 指令6. touch 指令7. mkdir 指令8. rmdir 和 rm 指令9. cp 指令10. mv 指令 1. Linux下的小技…

PolarisMesh源码系列--Polaris-Go注册发现流程

导语 北极星是腾讯开源的一款服务治理平台&#xff0c;用来解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题。在分布式和微服务架构的治理领域&#xff0c;目前国内比较流行的还包括 Spring Cloud&#xff0c;Apache Dubbo 等。在 Kubernete…

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序 演示站&#xff1a; https://enname.wengu8.com/ 程序截图&#xff1a; 程序说明&#xff1a; 1、前端模板PC手机端自适应。 2、全部数据带25W名字数据&#xff0c;后台可编辑&#xff0c;包括json格式的…

【Docker】Docker-compose 单机容器集群编排工具

目录 一.Docker-compose 概述 1.容器编排管理与传统的容器管理的区别 2.docker-compose 作用 3.docker-compose 本质 4.docker-compose 的三大概念 二.YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 三.Docker-compose …

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发&#xff0c;也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一&#xff0c;为什么要学习鸿蒙 1-1&#xff0c;鸿蒙介绍 1-2&#xff0c;为什么要学习鸿蒙 1-3&#xff0c;鸿蒙各个版本介绍 1-4&#xff0…

【用栈操作构建数组】python刷题记录

润到栈模块. class Solution:def buildArray(self, target: List[int], n: int) -> List[str]:#每一个缺失的数字填入pushpop&#xff0c;其他数字只需要填入push即可#再简化思路&#xff0c;读取到的数小于当前&#xff0c;pushpop,直到等于当前才pushans[]cur0for i in ta…

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

zabbix“专家坐诊”第246期问答

问题一 Q&#xff1a;有哪位大哥知道这是啥情况&#xff0c;6.4主动检查接口显示未知&#xff1f; A&#xff1a;看看agent配置文件的主采集有没有填写正确IP。 Q&#xff1a;我刚刚客户端重新授权&#xff0c;发现可以预警了&#xff0c;但是还是灰色的&#xff0c;我尝试输…

直播平台优化方案:直播美颜SDK开发详解

本篇文章&#xff0c;笔者将详细介绍直播美颜SDK的开发过程&#xff0c;帮助开发者为其平台增添这一重要功能。 一、美颜SDK的基本概念 通过美颜SDK&#xff0c;用户在进行直播时可以轻松地美化自己的形象&#xff0c;提高观众的观看体验。 二、美颜SDK的核心功能 1.实时美颜…

人工智能算法工程师(高级)课程2-多类目标识别之RCNN系列模型与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(高级)课程2-多类目标识别之RCNN系列模型与代码详解。本文全面解析了RCNN系列模型&#xff0c;包括R-CNN、Fast R-CNN、Faster R-CNN等&#xff0c;重点阐述了基于PyTorch框架实现多目标检测与识…

成为一位优秀的项目经理,这一点很重要

在管理工作中&#xff0c;我们可能会遇到这样的情况&#xff1a;有的人业务能力很强&#xff0c;堪称行业内的佼佼者&#xff0c;但当领导却仿佛失去了方向&#xff0c;管理起来显得力不从心&#xff0c;甚至一团糟。 业务能力和领导力是两个既相关又独立的概念。 业务能力是…

飞凌嵌入式RK3576开发板的MIPI-CSI调试——通路解析

MIPI-CSI是一种在嵌入式系统或移动设备中常见的摄像头接口&#xff0c;能够实现高速的图像数据传输。飞凌嵌入式最新推出的OK3576-C开发板拥有丰富的资源接口&#xff0c;其中支持5个CSI-2接口&#xff0c;意味着最多可同时支持5路摄像头的输入。 本篇内容就通过OK3576-C开发板…

2024年9月CCF GESP第七次认证开启报名 6547网

CCF GESP第七次认证时间为2024年9月7日&#xff0c;1-4级认证时间为上午9:30-11:30&#xff0c;5-8级认证时间为下午13:30-16:30。7月18日17:00开启9月认证报名通道&#xff0c;考生可登录GESP官网进行报名。GESP认证方式为全国各GESP考点上机考试&#xff0c;认证语言包括&…

Monaco 使用 FoldingRangeProvider

Monaco 中支持代码折叠功能&#xff0c;FolderRangeProvider 是一个通知功能&#xff0c;编辑文档会根据大括号的范围进行折叠&#xff0c;也就是可折叠区域都是以左大括号开始&#xff0c;右大括号结束&#xff0c;当折叠区域发生变更时&#xff0c;内部方法会被调用。 通过 …

数据结构——hash(hashmap源码探究)

hash是什么&#xff1f; hash也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变成固定长度的输出&#xff0c;这个输出值就是散列值。 举例来说明一下什么是hash&#xff1a; 假设我们要把1~12存入到一个大小是5的hash表中&#xff0c;我们…