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

回顾一下冒泡排序和快速排序

冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。这个过程就像水中的气泡逐渐上浮,所以称为冒泡排序。

核心步骤:

  1. 从数组的第一个元素开始,比较相邻的两个元素
  2. 如果第一个比第二个大,则交换它们的位置
  3. 对每一对相邻元素重复上述步骤,直到数组末尾
  4. 完成一轮后,最大的元素会 "浮" 到数组的最后位置
  5. 重复以上步骤,每次忽略已经排好序的最后一个元素
  6. 直到没有任何一对元素需要交换,排序完成
static void booble(int[] nums){for(int i=0;i<nums.length-1;i++){for(int j=0;j<nums.length-1-i;j++){if(nums[j+1]<nums[j]){int temp=nums[j+1];nums[j+1]=nums[j];nums[j]=temp;}}}}

比如说目前数组nums为{3,2,1},那么j第一次判断3>2,两者交换,数组为{2,3,1},第二次判断3>1,数组为{2,1,3};

第二次判断的时候呢,由于最后一个元素 已经“浮起来了”,确认为数组中最大的值,那么只需要比较nums.length-1-i,也就是3-1-1=1次就可以了,最终数组为{1,2,3}。

快速排序

快速排序采用分治法(Divide and Conquer)的思想,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序。

核心步骤:

  1. 选择数组中的一个元素作为 "基准"(pivot)
  2. 将所有小于基准的元素移到基准前面,所有大于基准的元素移到基准后面(分区操作)
  3. 对基准左右两个子数组重复以上步骤,直到每个子数组只有一个元素或为空
static void fastSort(int[] nums,int left,int right){if(left<right){int index=partition(nums,left,right);fastSort(nums,left,index-1);fastSort(nums,index+1,right);}}// 分区操作:以最左边元素为基准static int partition(int[] array, int left, int right) {// 选择最左边的元素作为基准int pivot = array[left];// i 是小于等于基准区域的右边界(初始为基准位置)int i = left;// j 从基准的下一个位置开始遍历到右边界for (int j = left + 1; j <= right; j++) {// 如果当前元素小于等于基准,将其加入左侧区域if (array[j] <= pivot) {i++; // 扩展左侧区域swap(array, i, j); // 交换元素到左侧区域}}// 将基准元素交换到左侧区域的最后位置(基准的正确位置)swap(array, left, i);// 返回基准元素的索引return i;}// 交换数组中两个位置的元素static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}

主要的函数为分区函数,代码中每次将最左侧的元素定义为pivot,然后寻找比pivot更小的数放在其左边,这时我们用i去定义为小于等于pivot的右边界,j从基准的下一个位置开始一直更新到right右边界。

比如目前数组为3,1,2,4,5,那么j从1开始向后遍历,最终返回的索引i是2,这一次交换完位置的数组为21345。


文章转载自:

http://graWj9uV.tcxzn.cn
http://zGnoulKB.tcxzn.cn
http://VmgmcnVp.tcxzn.cn
http://m4mmwlb5.tcxzn.cn
http://usWBYkuM.tcxzn.cn
http://X1fTEzxu.tcxzn.cn
http://L0wCssqB.tcxzn.cn
http://JsFKGyh4.tcxzn.cn
http://UGPT2Njo.tcxzn.cn
http://zN35xc0X.tcxzn.cn
http://19eZucA6.tcxzn.cn
http://Yo8QynE2.tcxzn.cn
http://6qw8exaX.tcxzn.cn
http://5JrN4QoO.tcxzn.cn
http://orr8F8ck.tcxzn.cn
http://KkF6wjYp.tcxzn.cn
http://GItvgtU7.tcxzn.cn
http://LHr1431F.tcxzn.cn
http://oyur8oga.tcxzn.cn
http://Jzrg2ETM.tcxzn.cn
http://JUoZCrPh.tcxzn.cn
http://lrYE2awj.tcxzn.cn
http://FIgPaBMc.tcxzn.cn
http://IO2FY7Ot.tcxzn.cn
http://nHqfpQyj.tcxzn.cn
http://9VL7JiFH.tcxzn.cn
http://yW7W0DZ2.tcxzn.cn
http://85e4uYZF.tcxzn.cn
http://u04HNtI6.tcxzn.cn
http://hUWMOR3a.tcxzn.cn
http://www.dtcms.com/a/388135.html

相关文章:

  • 基于随机动作指令的动态活体检测技术:人脸识别的安全守护者
  • 9.17 学习记录
  • 桥接、NAT和仅主机模式【介绍】
  • C语言程序从开发到单片机执行:编译、存储与运行机制详解
  • 利用云手机实现热血江湖游戏多开
  • Leetcode学习(灵神精讲题)167. 两数之和 II - 输入有序数组(相向双指针)
  • 力扣习题哈希表篇:两句话中不常见单词
  • 分布式流处理与消息传递——向量时钟 (Vector Clocks) 算法详解
  • 车载诊断架构 --- 无车辆识别码(VIN)时的车辆声明报文规范
  • 解读智慧政务云计算数据中心建设方案【附全文阅读】
  • 潜水员戴夫团队新作《纳克园 最后的乐园》开发顺利!
  • 第十八章 Arm C1-Premium Core 嵌入式追踪扩展 (ETE) 详解
  • 理解 multipart/form-data 中的 boundary:文件上传的关键
  • rust中的“继承”
  • PAT乙级_1087 有多少不同的值_Python_AC解法_无疑难点
  • 007 Rust字符串
  • 使用 Compose 部署 WordPress
  • Golang语言入门篇006_关键字与保留字详解
  • Class60 Transformer
  • Redis 线上故障案例分析:从救火到防火的实战指南
  • uv虚拟环境起名
  • YASKAWA安川机器人铝材焊接节气之道
  • 2025 AIME Benchmark:AI 在奥数领域的最新进展
  • 【ubuntu24.04】删除6.14内核升级6.11.0-29-generic内核nvidia驱动535到550
  • nvm下载低版本node
  • Day44 51单片机UART串行通信 软件模拟UART + 硬件UART回显
  • Freertos系列(调度机制与创建任务)
  • 深度学习(二)
  • 搭建node脚手架(六) ESLint 功能模块
  • mysql面试(2)