当前位置: 首页 > news >正文

理解快速排序

理解快速排序

首先了解以下快速排序

快速排序(QuickSort)是一种常用的排序算法,属于比较排序算法的一种。它是由英国计算机科学家Tony Hoare于1960年提出的,是一种分而治之(divide and conquer)的算法。

快速排序的基本思想是通过选择一个基准元素,将数组分成两个子数组,然后对这两个子数组进行递归排序。具体步骤如下:

  1. 选择基准元素: 从数组中选择一个元素作为基准元素,通常选择数组的第一个元素。

  2. 分区操作: 将数组中小于基准元素的元素移到基准元素的左边,大于基准元素的元素移到基准元素的右边。基准元素在这个过程中找到了最终的排序位置。这个操作称为分区操作。

  3. 递归排序: 对基准元素左右两侧的子数组分别进行递归排序。

这个过程递归进行,直到整个数组有序。由于快速排序采用了分治的思想,它的平均时间复杂度为O(n log n),其中n是数组的长度。在最坏情况下,快速排序的时间复杂度为O(n^2),但通常情况下它的性能很好,而且它是原地排序算法,不需要额外的空间。

快速排序是许多排序算法中最快的一种,它在实际应用中被广泛使用。

下面给大家画一下图来理解以下快速排序(以中间元素为基准):

首先确定基准元素

在这里插入图片描述

然后就是对序列进行遍历,如果比基准元素大的就放到右边,比基准元素小的就放到左边,确定一个变量left(排序的起点,这里为数列开始),从左边开始如果遇到一个比基准元素大的就停下,确定一个变量right(排序的终点,这里为数列结尾),从右边开始遇到一个比基准元素小的节点停止,然后交换两个停止索引的值,然后继续进行遍历,遇到上面同样的情况进行交换,如果left>right 就停止(此时第第一个分区结束),进行下一次的基准选择与分区,其实这里就是递归调用的抵挡。分为左右两边。

在这里插入图片描述

在这里插入图片描述

此时第一次区分结束,使得基准的左边都小于基准,右边都大于

在这里插入图片描述

分为两个数列,然后重复上面的操作。知道只有一个那就是排序完成

在这里插入图片描述

代码实现

第一个版本

public static void method2(int[] arr,int left , int right){int start = left ;int end = right;if(start>=end){return;}while(left <= right){int pivot = arr[(left + right)/2];while(left<=right && arr[left]<pivot) left++;while(left<=right && arr[right]> pivot) right--;if(left <= right){int temp = arr[right];arr[right] = arr[left];arr[left] = temp;left ++;right--;}}method2(arr,start,right);method2(arr,left,end);}

第二个版本

public static void method1(int[] arr,int left,int right){if(left < right){int i = left -1 ;int pivot = arr[right];for(int j = left ; j< right ;j++){if(arr[j] < pivot){i++;int temp = arr[j];arr[j] = arr[i];arr[i] = temp;}}int pivotIndex = i + 1;int temp = arr[right];arr[right] = arr[pivotIndex];arr[pivotIndex] = temp;method1(arr,left,pivotIndex-1);method1(arr,pivotIndex+1,right);}}

代码的理解细看上面文字就好了。

点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

也可以加我QQ(2837468248)咨询说明来意!

http://www.lryc.cn/news/228368.html

相关文章:

  • 初始MySQL(三)(合计函数,分组函数,字符串相关函数,数字相关函数,时间日期函数,加密函数,流程控制函数)
  • AI系统ChatGPT源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型
  • 程序员语录:一个真正有本事的人,往往有哪些特征呢?
  • 做一个Springboot文章分类模块
  • MTK手机平台充电原理
  • 产品化的GPT,能否为“百模大战”照亮未来?
  • 【中间件篇-Redis缓存数据库03】Redis高级特性和应用(发布 订阅、Stream)
  • Verilog基础:三段式状态机与输出寄存
  • 抖音商城双11好物节,从供需两侧重新定义“好货”
  • Mysql Explain工具介绍
  • Linux系统中的静态库和共享库,以及一些计算机的基础知识
  • 商品管理图片更换实现
  • SDL2 加载图片
  • 监控和数据采集软件架构和详细设计
  • 链动2+1模式系统开发之区域代理深度解析
  • Amazon Bedrock | 大语言模型CLAUDE 2体验
  • 通讯协议学习之路(实践部分):IIC开发实践
  • 『亚马逊云科技产品测评』活动征文|搭建带有“弱”图像处理功能的流媒体服务器
  • 正交矩阵的定义
  • K8S集群etcd 某个节点数据不一致如何修复 —— 筑梦之路
  • selenium/webdriver运行原理与机制
  • 论文阅读[121]使用CAE+XGBoost从荧光光谱中检测和识别饮用水中的有机污染物
  • Juniper SRX PPPoE配置
  • 虚拟仪器软件结构VISA
  • /etc/init.d/functions: Syntax error: “(“ unexpected (expecting “done“)
  • Google/微端/Amazon/IBM四个厂家在分布式里面提供的服务总结
  • 计网:第一章 概述
  • RT-DETR算法优化改进:新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022
  • 基于遗传算法改进的GRNN多输入多输出回归预测,基于多目标遗传算法+GRNN的帕累托前沿求解,基于遗传工具箱调用GRNN模型的多目标求解
  • vue2按需导入Element(vite打包)