C语言实现选择排序含0元素时失效,求问题原因
选择排序遇0元素失效的问题分析与修复
你的代码核心问题出在select函数的循环终止条件上:
for (j = i + 1; arr[j]; j++)
在C语言中,整数0会被当作布尔值false,当数组遍历到值为0的元素时,循环会直接终止,导致后续元素完全没有被比较。比如你输入的数组[4,1,3,9,0],当select函数遍历到索引4的0时,循环停止,程序根本没把这个0纳入最小值的比较范围,自然无法将它放到正确的位置。
修复方案
修改select函数,新增数组长度参数n,并将循环条件改为基于索引范围的判断(而非元素值):
// 新增n参数,明确遍历范围 int select(int arr[], int i, int n) { int j, minIndex; minIndex = i; // 循环条件改为j < n,确保遍历完所有剩余元素 for (j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) minIndex = j; } return minIndex; } void selectionSort(int arr[], int n) { int i, iMin; for (i = 0; i < n - 1; i++) { // 调用select时传入n参数 iMin = select(arr, i, n); if (iMin != i) { int temp = arr[i]; arr[i] = arr[iMin]; arr[iMin] = temp; } } }
修改后,无论数组中是否包含0,程序都会严格遍历从索引i+1到n-1的所有元素,确保最小值被正确找到并完成交换。用你提供的测试数组[4,1,3,9,0]测试,会得到正确的排序结果[0,1,3,4,9]。
内容的提问来源于stack exchange,提问作者Leuel Asfaw
相关产品推荐
相关产品推荐

