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

自实现数组排序代码异常:VSCode无输出、终端死循环、在线编译器段错误

问题分析与修复方案

核心问题点

  • temp变量未初始化:当数组第一个元素就是当前最小值时,temp从未被赋值,后续访问arr[temp]会触发未定义行为(比如段错误)。
  • 最小值查找范围错误:内层循环每次从数组开头遍历,没有跳过已排好序的前j个元素,导致重复比较,还会把已排序的最小值再次交换回来,逻辑彻底混乱。
  • min变量未在每次外层循环重置:每次外层循环开始时,min没有更新为当前待排序区间的第一个元素,导致后续查找的始终是整个数组的最小值,无法完成排序。

修正后的代码

#include <stdio.h>
int main(){
    int arr[]={2,45,23,12,34,6,23,78,9,33};
    int len=sizeof(arr)/sizeof(int);
    int min_index;
    int temp;
    
    // 选择排序核心逻辑
    for(int j=0;j<len;j++){
        min_index = j; // 初始化为当前待排序区间的第一个元素索引
        // 从j+1开始查找待排序区间的最小值索引
        for(int i=j+1;i<len;i++){
            if(arr[i]<arr[min_index]){
                min_index = i;
            }
        }
        // 交换当前位置和最小值位置的元素
        temp = arr[j];
        arr[j] = arr[min_index];
        arr[min_index] = temp;
    }
    
    // 输出排序后的数组
    printf("Sorted array:\n");
    for(int k=0;k<len;k++){
        printf("%d ", arr[k]);
    }
    printf("\n");
    
    return 0;
}

修复说明

  1. 重置最小值索引:每次外层循环开始时,将min_index设为当前待排序区间的起始索引j,确保从正确位置开始查找最小值。
  2. 缩小查找范围:内层循环从j+1开始遍历,跳过已排好序的前j个元素,既提升效率又避免逻辑错误。
  3. 简化变量逻辑:去掉单独的min变量,直接通过arr[min_index]访问最小值,减少冗余。
  4. 优化输出格式:统一输出样式,让结果更易读。

内容的提问来源于stack exchange,提问作者BITE004 Mir Aatif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:55:21