news 2026/7/6 15:19:20

排序算法:冒泡排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
排序算法:冒泡排序

冒泡排序(Bubble Sort)详解

冒泡排序是一种基础的交换排序算法,核心思想是:重复遍历待排序数组,每次比较相邻的两个元素,若顺序错误则交换它们,直到没有元素需要交换为止。

资料:https://pan.quark.cn/s/43d906ddfa1bhttps://pan.quark.cn/s/90ad8fba8347https://pan.quark.cn/s/d9d72152d3cf

核心特点
  • 稳定性:稳定(相等元素的相对位置不变)
  • 时间复杂度
    • 最好情况(已排序):O(n)(需优化标志位)
    • 最坏情况(逆序):O(n²)
    • 平均情况:O(n²)
  • 空间复杂度:O(1)(原地排序)
  • 适用场景:小规模数据、对稳定性有要求的简单场景

算法原理

  1. 从数组第一个元素开始,依次比较相邻的两个元素(如arr[i]arr[i+1]);
  2. arr[i] > arr[i+1](升序),则交换两者位置;
  3. 一轮遍历结束后,最大的元素会“冒泡”到数组末尾
  4. 重复上述过程,每轮遍历的终点向前收缩一位(已排序的末尾元素无需再比较);
  5. 若某一轮遍历中没有发生任何交换,说明数组已完全有序,可提前终止(优化)。

代码实现(Python)

defbubble_sort(arr):# 复制数组避免修改原数据arr_copy=arr.copy()n=len(arr_copy)# 外层循环:控制遍历轮数(最多n-1轮)foriinrange(n-1):# 标志位:标记本轮是否发生交换(优化)swapped=False# 内层循环:每轮比较到未排序的最后一位(n-1-i)forjinrange(n-1-i):# 升序:前一个元素大于后一个则交换ifarr_copy[j]>arr_copy[j+1]:arr_copy[j],arr_copy[j+1]=arr_copy[j+1],arr_copy[j]swapped=True# 若本轮无交换,说明数组已有序,提前退出ifnotswapped:breakreturnarr_copy# 测试示例if__name__=="__main__":# 无序数组unsorted_arr=[64,34,25,12,22,11,90]sorted_arr=bubble_sort(unsorted_arr)print("原始数组:",unsorted_arr)print("排序后数组:",sorted_arr)# 输出:[11, 12, 22, 25, 34, 64, 90]# 已排序数组(验证优化)sorted_test=[1,2,3,4,5]print(bubble_sort(sorted_test))# 仅1轮遍历即退出

代码实现(Java)

publicclassBubbleSort{publicstaticint[]bubbleSort(int[]arr){// 复制数组避免修改原数据int[]arrCopy=Arrays.copyOf(arr,arr.length);intn=arrCopy.length;for(inti=0;i<n-1;i++){booleanswapped=false;// 交换标志位// 内层循环:每轮减少i次比较(末尾i个已排序)for(intj=0;j<n-1-i;j++){if(arrCopy[j]>arrCopy[j+1]){// 交换元素inttemp=arrCopy[j];arrCopy[j]=arrCopy[j+1];arrCopy[j+1]=temp;swapped=true;}}// 无交换则提前终止if(!swapped){break;}}returnarrCopy;}publicstaticvoidmain(String[]args){int[]unsortedArr={64,34,25,12,22,11,90};int[]sortedArr=bubbleSort(unsortedArr);System.out.print("原始数组:");for(intnum:unsortedArr)System.out.print(num+" ");System.out.print("\n排序后数组:");for(intnum:sortedArr)System.out.print(num+" ");}}

关键优化点

  1. 提前终止:通过swapped标志位,若某轮无交换则直接退出,避免无效遍历;
  2. 收缩遍历范围:每轮遍历的终点为n-1-i,因为后i个元素已排序完成;
  3. 双向冒泡(鸡尾酒排序):针对“部分有序”的数组(如[1,3,2,4,5]),可从左到右、再从右到左交替遍历,减少遍历次数。

适用场景

  • 数据量小(n < 1000),对性能要求不高;
  • 需保证排序稳定性;
  • 教学场景(易理解、易实现)。

不适用场景:大数据量(如n > 10000),此时应选择快速排序、归并排序等O(n log n)的算法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 9:49:18

2025年战略咨询在行业标准演进中的推动力

2025年&#xff0c;战略咨询在推动行业标准演进方面发挥着重要作用。针对当前市场需求的变化&#xff0c;咨询公司为企业提供定制化的解决方案&#xff0c;使之适应不断更新的行业标准。通过深入市场分析&#xff0c;战略咨询不仅帮助企业识别新的竞争机会&#xff0c;还有效提…

作者头像 李华
网站建设 2026/7/4 2:30:13

【电商API接口】电商平台价格监控行业全景:数据驱动的定价革命

一、行业概况与市场规模电商价格监控是指系统性追踪产品价格&#xff08;自身、竞品、市场均价&#xff09;&#xff0c;覆盖所有销售渠道&#xff0c;实现实时洞察与决策的商业实践。市场规模&#xff1a;全球价格监控软件市场预计 2025 年达19.2 亿美元&#xff0c;2034 年将…

作者头像 李华
网站建设 2026/7/6 9:43:31

dubbo源码之一次RPC请求的生死之旅(基于Dubbo 2.7.8)

1. 全景图&#xff1a;从宏观到微观在钻入代码之前&#xff0c;我们需要先在脑海中建立一张全景图。一次同步的 RPC 调用&#xff0c;大致可以分为三个阶段&#xff1a;消费端&#xff08;Consumer&#xff09;&#xff1a; 动态代理 -> 负载均衡 -> 封装请求 -> 编码…

作者头像 李华
网站建设 2026/7/2 10:19:12

基于SpringBoot+Vue的web城乡居民基本医疗信息管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着我国城乡居民基本医疗保险制度的不断完善&#xff0c;医疗信息管理系统的需求日益增长。传统的医疗信息管理方式存在效率低下、数据分散、安全性不足等问题&#xff0c;难以满足现代医疗服务的需求。城乡居民基本医疗信息管理系统的设计与实现&#xff0c;旨在通过信息…

作者头像 李华
网站建设 2026/6/30 20:41:46

【完整源码+数据集+部署教程】手势与标志识别检测系统源码[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着人工智能技术的迅猛发展&#xff0c;计算机视觉领域的研究逐渐成为了学术界和工业界的热点。手势与标志识别作为计算机视觉的重要应用之一&#xff0c;具有广泛的应用前景&#xff0c;尤其是在智能交互、辅助驾驶、智能家居和人机交互等领域。手势和标志不仅…

作者头像 李华