首页 > 解决方案 > 查找数组的第 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))

如您所见,目标是找到第三大价值。但我不知道第二个循环是如何工作的。能不能一步一步给我解释一下。例如,veriable j 是什么意思,尤其是为什么他们输入 let j = i +

标签: javascriptarraysloopsfor-loop

解决方案


此方法基本上执行数组的就地排序arr(但仅“k”次 - 不是完整排序),然后返回索引处的元素(来自现在部分排序的数组)k-1

内部for循环查看数组的剩余(未排序)部分以找到具有最高值的项目的索引:

if (arr[j] > arr[max_index]) {
   max_index = j;
}

您所询问的具体语句let j = i + 1, 表示“声明一个新变量 ,j并将其初始值设置为比外for循环的当前迭代大一”。“ j”是任意的,可以是任何有效的标识符,它只是在嵌套循环时经常使用,for因为最外层循环通常使用 i(可能是“索引”的缩写)。

在外循环的每次迭代结束时for,这些行交换数组元素,以便该元素位于正确的位置:

arr[i] = arr[max_index];
arr[max_index] = tmp;

如果您想真正了解这种方法的内部工作原理,我强烈建议您使用调试器逐步完成它 - 这可能是一次很棒的学习体验。即使只是使用一些临时console.log语句的经过验证的方法也可以帮助阐明正在发生的事情(例如,打印每次外部和内部循环迭代的状态arr和之后的状态)。max_index


推荐阅读