C语言选择排序代码未生效,新手求助修复方案
选择排序代码问题排查与修复
核心错误点
- 交换时机错误:选择排序的逻辑是先遍历完未排序区间,找到最小值的下标后只执行一次交换,但你把交换代码放在了内层
j循环里,每次发现更小元素就立即交换,直接打乱了数组的有序性,完全偏离了选择排序的设计逻辑。 - 变量冲突导致排序终止:打印数组的循环误用了外层排序循环的变量
i,将i重置为0,导致外层排序循环只执行了一轮就提前结束,数组根本没完成排序。 - 交换目标错误:交换时你写的是
array[j] = tempt,但实际应该交换的是array[i]和array[min],这里的目标元素写错了。
修复后的完整代码
#include <stdio.h> int main() { int i, j, temp, min; int array[] = { 2,9,15,7,5,3,11,8,4 }; int size = sizeof(array) / sizeof(array[0]); // 外层循环:控制排序轮次,每轮确定一个位置的最终元素 for (i = 0; i < (size - 1); i++) { min = i; // 内层循环:遍历未排序区间,找到最小值的下标 for (j = i + 1; j < size; j++) { if (array[j] < array[min]) { min = j; } } // 找到最小值后,仅执行一次交换 if (min != i) { temp = array[i]; array[i] = array[min]; array[min] = temp; } } // 排序完成后统一打印,用独立变量避免冲突 printf("排序后的数组:\n"); for (int k = 0; k < size; k++) { printf("%d\n", array[k]); } return 0; }
额外说明
- 补充了
stdio.h头文件,这是printf函数必须的依赖,虽然部分编译器可能默认包含,但写代码时必须显式添加才符合规范。 - 如果需要查看每一轮排序的中间结果,可以把打印代码移到外层循环的末尾,但要保证用独立变量(比如示例中的
k),不能再复用i。
内容的提问来源于stack exchange,提问作者Vien Nguyen
相关产品推荐
相关产品推荐

