为何在JavaScript选择排序算法中使用索引变量可行?
选择排序中为何必须用变量存储最小元素索引?
直接使用内层循环的索引j来交换元素会出现两个核心问题:
错误代码的问题分析
先看你写的错误实现:
let myArray = [7, 9, 4, 16, 2, 0, 4, -18]; function selectionSortAlgorithm(anArray) { for (let i = 0; i < anArray.length - 1; i++) { let min = anArray[i]; for (let j = i + 1; j < anArray.length; j++) { if (min > anArray[j]) { min = anArray[j]; } } let temp = anArray[i]; anArray[i] = min; anArray[j] = temp; } return anArray; } console.log(selectionSortAlgorithm(myArray));
j的作用域与最终值错误:因为内层循环用let声明j,它是块级作用域变量,当内层循环结束时,j的值已经等于anArray.length(触发循环终止的条件),此时anArray[j]访问的是数组外的位置,结果是undefined,交换操作完全不符合预期。j无法记录最小元素的真实索引:内层循环中j是逐个递增的遍历索引,就算你找到更小的元素更新了min,后续j还会继续向后遍历,最终j的位置和最小元素的位置没有任何关系,根本没法用来定位要交换的元素。
正确代码的逻辑修正
再看使用minIndex的正确实现:
let myArray = [7, 9, 4, 16, 2, 0, 4, -18]; function selectionSortAlgorithm(anArray) { for (let i = 0; i < anArray.length - 1; i++) { let min = anArray[i]; let minIndex = i; for (let j = i + 1; j < anArray.length; j++) { if (min > anArray[j]) { min = anArray[j]; minIndex = j; } } let temp = anArray[i]; anArray[i] = min; anArray[minIndex] = temp; } return anArray; } console.log(selectionSortAlgorithm(myArray));
minIndex的核心作用是全程跟踪当前未排序部分中最小元素的索引:
- 初始时假设当前
i位置的元素是最小的,所以minIndex = i - 每次找到更小的元素时,除了更新
min存储元素值,同时把minIndex更新为该元素的索引j - 内层循环结束后,
minIndex精准指向未排序部分中最小元素的位置,交换时就能准确把i位置的元素和最小元素位置的元素互换,符合选择排序的核心逻辑:每次选最小元素放到已排序部分的末尾。
内容的提问来源于stack exchange,提问作者mehdiqe
相关产品推荐
相关产品推荐

