查找数组第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。之后:
j从i+1开始逐个往后遍历所有未排序元素- 每碰到一个比
arr[max_index]更大的元素,就把max_index更新为当前j的下标 - 内层循环跑完后,
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
相关产品推荐
相关产品推荐

