2026/1/14 7:05:03
网站建设
项目流程
做家装的网站好,网页设计模板html代码dw,wordpress应用主题免费下载,推广链接赚钱深入浅出冒泡排序#xff1a;原理、实现与优化#xff08;附C代码#xff09;
大家好#xff01;今天我们来聊聊排序算法里最基础也最经典的一种——冒泡排序。它的核心思想简单易懂#xff0c;非常适合排序算法的入门学习。这篇文章会从原理拆解、过程演示、代码实现原理、实现与优化附C代码大家好今天我们来聊聊排序算法里最基础也最经典的一种——冒泡排序。它的核心思想简单易懂非常适合排序算法的入门学习。这篇文章会从原理拆解、过程演示、代码实现再到优化方向一步步带大家吃透冒泡排序最后附上可直接运行的C代码方便大家实操练习。一、什么是冒泡排序冒泡排序Bubble Sort是一种简单的交换排序算法它的核心思路是重复遍历要排序的数组每次比较相邻的两个元素如果它们的顺序错误就把它们交换过来。为什么叫“冒泡”呢因为在排序过程中较大的元素会像水中的气泡一样逐渐“上浮”到数组的末尾或者较小的元素“下沉”到数组开头每一轮遍历都会确定一个未排序部分的最大或最小元素的最终位置。二、冒泡排序的核心原理与过程演示1. 核心原理冒泡排序的本质是通过相邻元素的多次比较与交换将无序元素逐步“筛选”到正确位置。其基本步骤如下从数组的第一个元素开始依次比较相邻的两个元素第i个和第i1个如果前者大于后者升序排序则交换这两个元素的位置继续向后比较下一对相邻元素直到遍历到数组的末尾完成一轮遍历后数组中最大的元素会被“冒泡”到数组的最后一位这一位已排序完成后续遍历无需再考虑重复上述过程每轮遍历排除已排序的末尾元素直到整个数组有序。2. 过程演示以数组 [5, 3, 8, 4, 2] 升序排序为例初始数组[5, 3, 8, 4, 2]第1轮遍历未排序范围0~4比较 5 和 353交换 → [3, 5, 8, 4, 2]比较 5 和 858不交换 → [3, 5, 8, 4, 2]比较 8 和 484交换 → [3, 5, 4, 8, 2]比较 8 和 282交换 → [3, 5, 4, 2, 8]结果最大元素 8 冒泡到末尾有序部分[8]第2轮遍历未排序范围0~3比较 3 和 535不交换 → [3, 5, 4, 2, 8]比较 5 和 454交换 → [3, 4, 5, 2, 8]比较 5 和 252交换 → [3, 4, 2, 5, 8]结果第二大元素 5 冒泡到倒数第二位有序部分[5, 8]第3轮遍历未排序范围0~2比较 3 和 434不交换 → [3, 4, 2, 5, 8]比较 4 和 242交换 → [3, 2, 4, 5, 8]结果第三大元素 4 冒泡到倒数第三位有序部分[4, 5, 8]第4轮遍历未排序范围0~1比较 3 和 232交换 → [2, 3, 4, 5, 8]结果第四大元素 3 冒泡到倒数第四位有序部分[3, 4, 5, 8]此时数组已完全有序无需进行第5轮遍历。最终排序结果[2, 3, 4, 5, 8]三、冒泡排序的C代码实现1. 基础版本未优化根据上述原理我们可以直接写出基础版本的冒泡排序代码。核心是双重循环外层循环控制遍历轮数最多n-1轮n为数组长度内层循环控制每轮的相邻元素比较与交换。#includeiostream#includevectorusingnamespacestd;// 冒泡排序基础版本升序voidbubbleSortBasic(vectorintarr){intnarr.size();// 外层循环控制排序轮数最多需要n-1轮for(inti0;in-1;i){// 内层循环每轮比较相邻元素排除已排序的末尾i个元素for(intj0;jn-1-i;j){// 如果前一个元素大于后一个交换if(arr[j]arr[j1]){swap(arr[j],arr[j1]);// C标准库swap函数交换两个元素}}}}// 打印数组voidprintArray(constvectorintarr){for(intnum:arr){coutnum ;}coutendl;}intmain(){vectorintarr{5,3,8,4,2};cout排序前;printArray(arr);bubbleSortBasic(arr);cout排序后;printArray(arr);return0;}2. 优化版本添加有序标记基础版本存在一个问题如果数组在第k轮k n-1就已经完全有序后续的轮数仍然会继续执行造成不必要的性能浪费。优化思路添加一个有序标记flag。每轮遍历开始前将flag设为true若本轮发生了元素交换则将flag设为false如果某轮遍历结束后flag仍为true说明数组已完全有序直接退出循环即可。#includeiostream#includevectorusingnamespacestd;// 冒泡排序优化版本添加有序标记voidbubbleSortOptimized(vectorintarr){intnarr.size();boolisSorted;// 标记数组是否已有序for(inti0;in-1;i){isSortedtrue;// 初始假设本轮遍历后数组有序for(intj0;jn-1-i;j){if(arr[j]arr[j1]){swap(arr[j],arr[j1]);isSortedfalse;// 发生交换说明数组尚未有序}}if(isSorted){break;// 若未发生交换直接退出循环无需后续遍历}}}// 打印数组voidprintArray(constvectorintarr){for(intnum:arr){coutnum ;}coutendl;}intmain(){vectorintarr{5,3,8,4,2};cout排序前;printArray(arr);bubbleSortOptimized(arr);cout排序后;printArray(arr);return0;}3. 代码运行结果上述两个版本的代码运行后输出结果均为排序前5 3 8 4 2 排序后2 3 4 5 8四、冒泡排序的性能分析1. 时间复杂度最坏情况数组完全逆序。此时每轮都需要进行n-1-i次比较和交换总比较次数为 (n-1) (n-2) … 1 n(n-1)/2时间复杂度为 O(n²)最好情况数组已完全有序优化版本。此时只需进行1轮遍历n-1次比较0次交换时间复杂度为 O(n)平均情况时间复杂度为 O(n²)。2. 空间复杂度冒泡排序是原地排序算法排序过程中只需要额外的常数级空间用于存储循环变量、有序标记等空间复杂度为 O(1)。3. 稳定性冒泡排序是稳定排序算法。因为只有当相邻元素严格大于或小于时才会交换相等元素不会发生交换因此它们的相对位置不会改变。五、冒泡排序的适用场景由于冒泡排序的时间复杂度为 O(n²)效率较低因此不适合处理大规模数据。其适用场景主要包括排序算法入门学习理解交换排序的核心思想处理小规模数据数据量n ≤ 1000对效率要求不高数组接近有序的场景优化版本可快速退出效率接近 O(n)。六、总结冒泡排序是最基础的排序算法之一核心是“相邻比较、逐步冒泡”。虽然效率不高但原理简单、代码实现容易是入门排序算法的绝佳选择。本文介绍了冒泡排序的原理、过程演示、基础版与优化版C代码并分析了其性能和适用场景。