这种选择排序的实现有什么问题?

What's the problem with this implementation of selection sort?

我正在学习选择排序。 我得到了一些值的正确输出,但不是所有值,不知道为什么??

请查看以下代码片段:

function selectionSortRecursion(arr,p){
    if( arr.length === 1){
        return p;
    }
    min=arr[0];
    for(var i =0;i<arr.length;i++){
        if (arr[i]<min){
            min = arr[i];
            var minIdx=i;
        }
    }
    temp=arr[0];
    arr[0]=arr[minIdx];
    arr[minIdx]=temp;
    p.push(arr.shift());

    return selectionSortRecursion(arr,p);
}
console.log(selectionSortRecursion([2,3,5,-3,20,0,2,6,-23],[]));

问题是除非执行循环内的if语句的主体,否则不会声明变量minIdx。如果最小元素位于索引 0,则 arr[i] < min 永远不会为真且 minIdx 未定义。

要解决它,在循环之前写 var minIdx = 0;,因为 min 被初始化为索引 0 处的值。你的其他几个变量应该用 var 声明,太:

function selectionSortRecursion(arr, p) {
    if(arr.length === 0) {
        return p;
    }
    var min = arr[0];
    var minIdx = 0;
    for(var i = 1; i < arr.length; i++) {
        if (arr[i] < min) {
            min = arr[i];
            minIdx = i;
        }
    }
    var temp = arr[0];
    arr[0] = arr[minIdx];
    arr[minIdx] = temp;
    p.push(arr.shift());

    return selectionSortRecursion(arr, p);
}

请注意,我还更改了循环变量 i 以从 1 开始,因为不需要将索引 0 与其自身进行比较;并且递归的基本情况应该是 arr.length 为 0 而不是 1,以避免丢失最后一个元素。