基于do-while循环实现的冒泡排序无法完全排序,求排查原因
冒泡排序代码问题分析与修复
你的代码无法完成完全排序的核心问题是flag的初始化位置错误:
当前代码里,flag = 0;被放在for循环内部,这意味着每遍历一个元素,flag都会被重置为0。哪怕这一轮遍历中前面已经发生过交换,只要最后一次元素比较没有交换,flag就会被设为0,导致do-while循环直接提前退出,此时数组还没完全排好序。
正确的做法是把flag = 0;移到do块的开头、for循环外面——每一轮遍历开始时先默认没有交换,只要这一轮里有任意一次交换操作,flag就会被设为1;只有当一整轮遍历下来完全没有交换时,才会退出循环,确保数组已经完全有序。
修复后的代码如下:
void bubbleSort(int lst[], int size) { int flag; do{ flag = 0; // 每轮遍历开始时假设无交换 for(int i = 0; i < size-1; i++) { if(lst[i] > lst[i + 1]) { // 交换元素 int temp = lst[i]; lst[i] = lst[i + 1]; lst[i+1] = temp; flag = 1; // 发生交换,标记flag } } }while (flag != 0); }
另外,你原代码里if判断外的int temp = lst[i];是多余的,可以直接删掉,不影响功能但能避免不必要的内存占用。
内容的提问来源于stack exchange,提问作者user21977286
相关产品推荐
相关产品推荐

