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

