自实现数组排序代码异常: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; }
修复说明
- 重置最小值索引:每次外层循环开始时,将
min_index设为当前待排序区间的起始索引j,确保从正确位置开始查找最小值。 - 缩小查找范围:内层循环从
j+1开始遍历,跳过已排好序的前j个元素,既提升效率又避免逻辑错误。 - 简化变量逻辑:去掉单独的
min变量,直接通过arr[min_index]访问最小值,减少冗余。 - 优化输出格式:统一输出样式,让结果更易读。
内容的提问来源于stack exchange,提问作者BITE004 Mir Aatif
相关产品推荐
相关产品推荐

