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

查找数组第k大元素的JS代码内层循环运行逻辑求解

数组第k大元素代码逻辑讲解
function Kth_greatest_in_array(arr, k) {
  for (let i = 0; i < k; i++) {
    let max_index = i;
    const tmp = arr[i];

    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] > arr[max_index]) {
        max_index = j;
      }
    }

    arr[i] = arr[max_index];
    arr[max_index] = tmp;
  }
  return arr[k - 1];
}
console.log(Kth_greatest_in_array([1,2,6,4,5], 3))

整体算法思路

这段代码是选择排序的简化实现,不需要对整个数组做全量排序,只需要把前k个最大的元素依次放到数组最前面的k个位置,最终取下标为k-1的元素就是第k大的数值。

内层for循环逻辑详解

这就是你提到的第二段for循环,核心作用是从剩余未排序的元素中找到最大值的下标。

变量含义

  • j是内层循环的遍历指针,用来逐个扫描未排序区间的元素,对比找到最大值的位置。

为什么初始化是let j = i + 1

这个设置是为了减少不必要的重复计算:
每跑完一轮外层循环,数组下标0 ~ i的位置已经存放了前i+1大的元素,这些元素的位置已经固定,不需要再参与后续比较。我们只需要从i+1的位置开始,遍历后面还没排序的元素即可。

内层循环执行流程

每轮外层循环启动时,会默认当前下标i的元素是未排序区间的最大值,所以max_index初始赋值为i。之后:

  1. j从i+1开始逐个往后遍历所有未排序元素
  2. 每碰到一个比arr[max_index]更大的元素,就把max_index更新为当前j的下标
  3. 内层循环跑完后,max_index就是未排序区间里最大值的下标,后续只要交换arr[i]和arr[max_index],就能把这个最大值放到i的固定位置

示例逐轮运行演示

我们用你给出的输入arr=[1,2,6,4,5]、k=3做逐轮拆解:

第1轮外层循环 i=0(找第1大的元素)

  • 初始max_index=0,tmp=arr[0]=1
  • 内层j从1开始遍历:
    • j=1:arr[1]=2 > arr[0]=1 → max_index更新为1
    • j=2:arr[2]=6 > arr[1]=2 → max_index更新为2
    • j=3:arr[3]=4 < arr[2]=6 → 不更新
    • j=4:arr[4]=5 < arr[2]=6 → 不更新
  • 交换arr[0]和arr[2],数组变为[6,2,1,4,5],下标0位置固定为第1大的元素6

第2轮外层循环 i=1(找第2大的元素)

  • 初始max_index=1,tmp=arr[1]=2
  • 内层j从2开始遍历:
    • j=2:arr[2]=1 < 2 → 不更新
    • j=3:arr[3]=4 > 2 → max_index更新为3
    • j=4:arr[4]=5 > 4 → max_index更新为4
  • 交换arr[1]和arr[4],数组变为[6,5,1,4,2],下标1位置固定为第2大的元素5

第3轮外层循环 i=2(找第3大的元素)

  • 初始max_index=2,tmp=arr[2]=1
  • 内层j从3开始遍历:
    • j=3:arr[3]=4 > 1 → max_index更新为3
    • j=4:arr[4]=2 < 4 → 不更新
  • 交换arr[2]和arr[3],数组变为[6,5,4,1,2],下标2位置固定为第3大的元素4
    外层循环跑完k=3次,返回arr[k-1] = arr[2] =4,和运行结果一致。

内容的提问来源于stack exchange,提问作者Piotrek Krakowiak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:45:07