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

C语言选择排序算法无法输出完整排序数组仅重复打印最小元素

代码问题分析
  • 核心逻辑错误:每次调用smallest查找最小值时,都是遍历完整的原始输入数组,找到最小元素后没有对该位置的元素做失效处理,导致每一轮查找返回的都是同一个全局最小元素的下标,最终输出重复的最小值。
  • 函数定义不合法:select_sort声明的返回值类型为int,但实际返回的是局部数组的指针,类型完全不匹配;同时栈上的局部数组new_arra在函数执行结束后会被系统回收,返回它的地址属于未定义行为,即使你当前代码没有用到返回值,也存在语法隐患。
  • 输出格式问题:打印元素时没有添加空格、换行等分隔符,排序后的结果会拼接为一串连续数字,无法区分单个元素。
修复方案(不使用动态内存分配)

你可以在每次找到最小元素后,将原数组对应位置的元素赋值为一个远大于数组所有元素的最大值,确保下一轮查找不会重复选中该元素,同时调整函数返回值为void去掉非法的数组返回逻辑,修改后代码如下:

#include <stdio.h>
#include <limits.h> // 引入INT_MAX宏定义

int smallest(int [],int);
void select_sort(int[],int); // 修改返回值为void

int smallest(int arr[],int len){
    int small_index=0;
    int small=arr[0];
    for(int i=0;i<len;i++){
        if(arr[i]<small){
            small=arr[i];
            small_index=i;
        }
    }
    return small_index;
}

void select_sort(int arra[],int len){
    int new_arra[100];
    for(int i=0;i<len;i++){
        int small_idx = smallest(arra,len);
        new_arra[i] = arra[small_idx];
        printf("%d ", new_arra[i]); // 添加空格分隔
        arra[small_idx] = INT_MAX; // 标记当前最小元素已被选出,下一轮不会重复匹配
    }
}

int main()
{
    int arr[100]={6,1,0,-2,18};
    select_sort(arr,5);
    return 0;
}

运行后会输出排序结果:-2 0 1 6 18 ,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:45:04