请解释冒泡排序(Bubble Sort)及对应C语言实现代码无法运行的问题
冒泡排序基本原理
冒泡排序是基础的交换类排序算法,核心逻辑为:
- 逐轮遍历待排序的数组,每次对比相邻的两个元素
- 如果两个元素顺序不符合排序要求(比如要升序的话,就是前面的数比后面的大),就交换两个元素的位置
- 每一轮遍历结束后,当前未排序区间里的最大/最小值就会被“冒泡”到区间的末尾
- 重复执行遍历操作,直到某一轮遍历全程没有发生任何交换,说明数组已经完全有序,结束排序
你提交的代码存在的问题
你写的代码无法运行、不能实现排序的原因如下:
- 变量未声明:
i、j、temp三个变量均没有提前声明,C语言要求所有变量必须先声明后使用,缺少声明会直接报编译错误。 - 交换逻辑错误:你判断
a[j] < a[i]需要调整顺序,但实际交换的是a[i+1]和a[j],不仅a[i]的值没有被调整,还会直接覆盖a[i+1]的原始值,逻辑完全错误。 - 逻辑不符合冒泡排序的设计:你当前的双层循环结构更接近选择排序的写法,标准冒泡排序的内层循环是逐位对比相邻元素,而不是用
j直接和i对比。
修正后的冒泡排序实现代码
void bubble(int a[], int n) { // 先声明所有需要用到的变量 int i, j, temp; // 加flag做优化:某轮没有交换就说明已经有序,直接退出 int flag; for(i = 0; i < n - 1; i++) { flag = 0; // 内层循环遍历未排序区间,对比相邻元素 for(j = 0; j < n - 1 - i; j++) { // 升序排序:前面的数比后面的大就交换 if(a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; flag = 1; } } if(flag == 0) { break; } } }
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

