You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:37:24