C语言冒泡排序实现与解析

张开发
2026/4/20 1:50:29 15 分钟阅读

分享文章

C语言冒泡排序实现与解析
C语言冒泡排序代码实现及原理详解1. 算法原理解构冒泡排序的核心思想是**“相邻比较逐步归位”**。它通过重复地走访需要排序的数列一次比较两个相邻的元素如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换也就是说该数列已经排序完成 。核心逻辑比较相邻的两个元素如果前一个比后一个大升序或小降序就交换它们。过程对每一对相邻元素做同样的工作从开始第一对到结尾的最后一对。这样一轮下来最大或最小的元素会“冒泡”到数组的末尾 。2. C语言代码实现以下是一个标准的 C 语言冒泡排序实现包含升序排列逻辑。代码中涵盖了数组大小计算、双重循环控制以及相邻元素交换的关键步骤。#include stdio.h // 冒泡升序排序函数 // 参数说明arr[] - 待排序数组count - 数组元素个数 void bubbleSort(int arr[], int count) { int temp 0; // 外层循环控制遍历轮数共需进行 count-1 轮 for (int i 0; i count - 1; i) { // 内层循环执行具体的比较和交换 // 每一轮结束后当前最大的元素已经归位到末尾因此范围是 count - i - 1 for (int j 0; j count - i - 1; j) { // 如果前一个元素大于后一个元素升序逻辑 if (arr[j] arr[j1]) { // 交换两个元素的位置 temp arr[j]; arr[j] arr[j1]; arr[j1] temp; } } } } int main() { // 初始化待排序数组 int data[] {64, 34, 25, 12, 22, 11, 90}; // 关键操作计算数组的元素个数 // sizeof(data) 计算整个数组所占的字节数 // sizeof(data[0]) 计算数组首元素所占的字节数 // 两者相除得到数组的实际长度 int size sizeof(data) / sizeof(data[0]); printf(排序前数组: ); for (int i 0; i size; i) { printf(%d , data[i]); } printf( ); // 调用排序函数 bubbleSort(data, size); printf(排序后数组: ); for (int i 0; i size; i) { printf(%d , data[i]); } printf( ); return 0; }3. 关键技术细节与注意事项在编写 C 语言冒泡排序时有几个容易出错的技术细节需要特别注意尤其是关于数组参数传递和大小计算的问题。注意事项说明错误示范 vs 正确做法数组长度计算必须在main函数或数组定义所在的作用域中计算长度不能在排序函数内部计算。错误在bubbleSort内使用sizeof(arr)/sizeof(arr[0])。正确在main中计算好size后作为参数传入。数组退化为指针当数组作为函数参数传递时它会退化为指向首元素的指针。在函数内部使用sizeof(arr)得到的是指针的大小32位系统为4字节64位系统为8字节而不是数组的大小 。若在函数内计算长度结果通常为 1 或 2取决于指针大小与元素大小的比值导致排序逻辑崩溃。循环边界条件外层循环控制轮数内层循环控制比较范围。每进行一轮外层循环内层循环的比较范围就减少 1因为末尾元素已有序。内层循环条件通常为j count - i - 1避免对已排序部分的重复比较。4. 执行流程推演以数组{64, 34, 25, 12}为例升序排序的推演过程如下第一轮 (i0)比较 64 和 34交换 -{34, 64, 25, 12}比较 64 和 25交换 -{34, 25, 64, 12}比较 64 和 12交换 -{34, 25, 12, 64}结果最大值 64 已“冒泡”至末尾。第二轮 (i1)比较 34 和 25交换 -{25, 34, 12, 64}比较 34 和 12交换 -{25, 12, 34, 64}结果次大值 34 归位至倒数第二位。后续轮次继续对剩余未排序部分{25, 12}进行比较和交换直到整个数组有序。通过上述代码和逻辑分析可以看出冒泡排序虽然算法简单但在实现时必须严格遵循 C 语言的内存管理规则特别是正确处理数组作为参数时的退化特性 。参考来源深入理解 C 语言冒泡排序从代码实现到原理剖析-腾讯云开发者社区-腾讯云[C语言]实现冒泡排序算法从入门到精通_c语言冒泡排序算法-CSDN博客冒泡排序算法详解C语言实现与应用 - Rare_30 - 博客园

更多文章