如何在递归选择排序函数内部初始化参数i=0和j=i+1?
把递归选择排序的全局索引移到函数内部的两种方案
你的原代码依赖全局的i和j控制递归流程,但全局变量会导致多次调用fSort时状态混乱(比如第一次排序后索引不会自动重置)。下面是两种将索引变量封装到函数内部的可行方案:
方案一:使用内部递归辅助函数
把索引作为辅助函数的参数,主函数负责初始化初始索引值:
function fSort(array) { // 内部辅助函数,接收当前遍历的i和j索引 function sortHelper(i, j) { if (array[j] < array[i]) { [array[i], array[j]] = [array[j], array[i]]; sortHelper(i, j); // 交换后继续比较当前位置 } else if (j < array.length - 1) { // j遍历到倒数第二个元素即可,避免数组越界 sortHelper(i, j + 1); // j向后移动一位 } else if (i < array.length - 1) { // i不需要处理最后一个元素 sortHelper(i + 1, i + 2); // i向后移动,j重置为i+1 } } sortHelper(0, 1); // 从初始索引开始递归 return array; }
方案二:利用函数参数默认值
直接让主函数接收可选的i和j参数,首次调用时自动初始化:
function fSort(array, i = 0, j = i + 1) { // 终止条件:i到达倒数第二个元素,排序完成 if (i >= array.length - 1) { return array; } if (array[j] < array[i]) { [array[i], array[j]] = [array[j], array[i]]; return fSort(array, i, j); } else if (j < array.length - 1) { return fSort(array, i, j + 1); } else { // j遍历完当前i的所有后续元素,移动i并重置j return fSort(array, i + 1, i + 2); } }
关键优化说明
- 原代码中
j < array.length的判断会导致j等于数组长度时访问array[j]越界,因此改为j < array.length - 1更安全; i的终止条件调整为i < array.length - 1,因为最后一个元素无需再参与比较;- 两种方案都彻底消除了全局变量,多次调用
fSort时不会出现状态互相干扰的问题。
内容的提问来源于stack exchange,提问作者Vlad U
相关产品推荐
相关产品推荐

