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

问题描述 投票:2回答:2

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

请参见下面的代码段:

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],[]));
javascript algorithm sorting selection quicksort
2个回答
1
投票

问题是,除非执行循环内的minIdx语句的主体,否则不会声明变量if。如果最小元素位于索引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时,以避免丢失最后一个元素。


0
投票

问题是,循环之前您没有initializeminIdx一起使用,因为如果最小元素位于索引0,则将永远不会达到0条件。

此外,当达到if (arr[i] < min) {条件时,最后一个元素应使用arr.length === 1方法。

push
© www.soinside.com 2019 - 2024. All rights reserved.