You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在递归选择排序函数内部初始化参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:36:18