用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
相关产品推荐
相关产品推荐

