数组最小值交换升序排序的代码逻辑不符问题及修正需求
问题分析与修正方案
你的代码确实能实现升序排序,但用的是相邻元素逐次交换的逻辑(类似冒泡排序),和要求的“先找最小值、再单次交换”的选择排序逻辑不符。
原代码的问题点
当前嵌套循环里,只要发现array[i]比array[k]大就立刻交换,这会导致每一轮未排序区间里,只要遇到更小的元素就做一次交换,而不是先找到整个未排序区间的最小值,再做一次交换操作。
指定逻辑的核心(选择排序)
要求的步骤本质是选择排序的标准流程:
- 每一轮只关注当前未排序区间的起始位置
i - 先遍历
i到数组末尾的所有元素,找到其中最小值的索引(记住位置,不是直接交换) - 遍历结束后,把最小值和
array[i]交换(如果最小值不在i位置的话) - 然后
i后移,重复直到排序完成
修正后的代码
public static int[] swapLowest(int[] array) { // 外层循环:当前要放置最小值的位置 for (int i = 0; i < array.length; i++) { int minIndex = i; // 先假设当前位置就是最小值的索引 // 内层循环:遍历未排序区间,找到最小值的索引 for (int k = i + 1; k < array.length; k++) { if (array[k] < array[minIndex]) { minIndex = k; // 更新最小值的索引 } } // 找到最小值后,只做一次交换(如果最小值不在当前位置) if (minIndex != i) { int temp = array[i]; array[i] = array[minIndex]; array[minIndex] = temp; } } return array; // 原代码遗漏了返回语句,需要补上 }
代码解释
- 外层循环
i标记当前要确定的位置,也就是把未排序区间的最小值放到这里 - 内层循环只负责查找最小值的位置,全程不做交换,只更新
minIndex - 内层循环结束后,判断最小值是否已经在
i位置:如果不在,才执行一次交换 - 补上原代码缺失的
return array,保证方法返回排序后的数组
这样修改后,就完全符合你指定的“先找最小值、再交换、移动索引、重复”的逻辑了。
内容的提问来源于stack exchange,提问作者Dumb Hacker Man
相关产品推荐
相关产品推荐

