矩阵指定列降序排序异常:BubbleSort算法失效求助
问题分析与修复
你的冒泡排序实现存在两个核心问题,导致无法完成指定列的降序排序:
1. 仅执行一轮遍历,未完成完整排序
冒泡排序需要多层循环:外层循环控制排序轮数(最多需要numberOfRows - 1轮),内层循环负责每一轮中相邻元素的比较与交换。你的代码只做了一轮遍历,仅能完成部分元素交换,无法让整列元素完全有序。
2. 数组下标越界
原循环条件i < numberOfRows会导致当i = numberOfRows - 1时,访问MAT[i+1][givenColumn](即MAT[numberOfRows][givenColumn]),这超出了矩阵的行下标范围(行下标应为0到numberOfRows-1),会触发未定义行为,可能导致程序崩溃或数据异常。
修复后的代码
void Prohod(float MAT[][4], int numberOfRows, int givenColumn) { float temp; // 外层循环:控制排序轮数,最多需要 numberOfRows - 1 轮 for (int pass = 0; pass < numberOfRows - 1; pass++) { // 内层循环:遍历未排序部分,避免下标越界 for (int i = 0; i < numberOfRows - pass - 1; i++) { // 降序排序:前元素小于后元素则交换 if (MAT[i][givenColumn] < MAT[i + 1][givenColumn]) { temp = MAT[i][givenColumn]; MAT[i][givenColumn] = MAT[i + 1][givenColumn]; MAT[i + 1][givenColumn] = temp; } } } printf("Given column:%d\n", givenColumn); }
关键修改说明
- 新增外层
pass循环:确保进行足够轮数的遍历,每一轮会把当前未排序部分的最小元素“沉”到列的末尾(降序场景下)。 - 调整内层循环条件为
i < numberOfRows - pass - 1:每完成一轮排序,末尾的pass个元素已处于有序状态,无需重复比较;同时彻底避免了下标越界问题。
内容的提问来源于stack exchange,提问作者Jacobfs
相关产品推荐
相关产品推荐

