基于指针实现冒泡排序的问题:内层循环无法正常迭代
问题分析与修复代码
你的代码核心问题是内外层循环共用了同一个指针变量myarr:
- 内层循环执行时,
myarr会一直移动到endptr2的位置 - 外层循环接着执行
myarr++,直接让myarr超过endptr,导致外层循环只跑一次,完全没法完成多轮冒泡排序的逻辑
下面是修复后的代码,用独立的指针分别处理内外层循环,同时优化了冒泡排序的边界逻辑:
#include<iostream> using namespace std; int main() { int arr[] = { 8, 6, 11, 3, 15, 5 }; // 计算数组长度,避免硬编码 int size = sizeof(arr) / sizeof(arr[0]); int* start = arr; // endptr2标记每轮需要比较的最后一个元素的前一位(因为要比较current和current+1) int* endptr2 = arr + size - 1; // 外层循环:每轮把最大的元素沉到当前未排序部分的末尾 while (endptr2 > start) { int* current = start; // 内层循环:遍历当前未排序部分,比较相邻元素 while (current < endptr2) { if (*current > *(current + 1)) { swap(*current, *(current + 1)); } current++; } // 每轮结束后,末尾的元素已经有序,缩小未排序范围 endptr2--; } // 打印排序后的数组验证结果 for (int* p = arr; p < arr + size; p++) { cout << *p << " "; } cout << endl; return 0; }
关键修改说明
- 内外层循环使用独立指针:外层用
endptr2控制未排序范围,内层用current遍历,互不干扰 - 优化边界条件:内层循环只需要遍历到
endptr2(即未排序部分的倒数第二个元素),避免越界访问 - 去掉硬编码的数组长度,用
sizeof计算,提升代码通用性 - 添加了排序结果打印,方便验证正确性
运行这段代码会输出:3 5 6 8 11 15,符合冒泡排序的预期结果。
内容的提问来源于stack exchange,提问作者Muhammad Abdullah BSCS 2022 FA
相关产品推荐
相关产品推荐

