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

用C语言实现的排序程序无法正确排序,请求排查代码错误

C语言排序程序错误排查

你的代码试图实现选择排序,但核心逻辑存在错误,导致无法正确完成排序。

问题根源

选择排序的核心逻辑是:在未排序区间找到最小值,将其与未排序区间的第一个元素交换。但你的代码中,m仅在每轮外层循环开始时被赋值为arr[i],当第一次找到更小的元素完成交换后,m的值并未更新为当前arr[i]的新值(也就是刚交换过来的更小值),后续比较仍然用最初的arr[i]进行判断,这会导致比较逻辑完全混乱,无法正确定位整个未排序区间的最小值。

举个实际例子:假设输入数组是[3,1,2,5,4],第一轮外层循环i=0时,m初始为3。当j=1时,3>1,交换后数组变为[1,3,2,5,4],但m仍然是3。接下来j=2时,用3和2比较,会错误地把arr[0]的1换成2,数组变成[2,3,1,5,4],完全偏离了正确的排序路径。

修正方案

有两种可行的修正方式:

方式1:交换后更新m的值

在每次交换操作后,把m更新为当前arr[i]的新值,确保后续比较用的是当前未排序区间的最小值:

#include <stdio.h>
int main() {
    int arr[5];
   
    for(int i=0; i<5; i++)
        scanf("%d",&arr[i]); 

    for(int i=0; i<5; i++)
    {
        int m=arr[i];
        for(int j=i+1; j <5; j++)
        {
            if(m>arr[j])
            {
                arr[i]=arr[j];
                arr[j]=m;
                m = arr[i]; // 新增:交换后更新m为当前arr[i]的值
            }
       }
   }

   for(int i=0; i<5; i++)
       printf("%d ",arr[i]);
   return 0;
}

方式2:标准选择排序实现(推荐)

这种方式先记录最小值的索引,最后仅执行一次交换操作,逻辑更清晰,同时减少了不必要的交换次数,效率更高:

#include <stdio.h>
int main() {
    int arr[5];
   
    for(int i=0; i<5; i++)
        scanf("%d",&arr[i]); 

    for(int i=0; i<5; i++)
    {
        int min_idx = i; // 记录未排序区间最小值的索引
        for(int j=i+1; j <5; j++)
        {
            if(arr[min_idx] > arr[j])
            {
                min_idx = j; // 更新最小值索引
            }
       }
       // 最后将最小值与未排序区间的第一个元素交换
       int temp = arr[i];
       arr[i] = arr[min_idx];
       arr[min_idx] = temp;
   }

   for(int i=0; i<5; i++)
       printf("%d ",arr[i]);
   return 0;
}

内容的提问来源于stack exchange,提问作者emtiaz ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:39:54