JavaScript —数组被一堆“未定义”填充

时间:2018-12-16 14:05:39

标签: javascript arrays sorting

我是JavaScript的新手,正在尝试实现选择排序以使我对数组不感兴趣(请注意:我知道这里有一个内置的排序功能)。不过,我遇到了一些奇怪的行为。

这是我的代码:

function selectionSort(array)
{
    let currentMin = 0;
    var minIndex = 0;

    function swap(array, i, j)
    {
        let temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    for(var i = 0; i < array.length - 1; i++)
    {
        console.log(array);
        currentMin = array[i];
        minIndex = i;

        for(var j = i + 1; j < array.length; j++)
        {
            if(array[j] < currentMin)
            {
                currentMin = array[j];
                minIndex = j;
            }
        }

        if(minIndex != i)
        {
            swap(array, i, j);
        }
    }

    console.log(array);

    return array;
}

var myArray = [2, 50, 8, 4, 3, -400, 12, 120];
var sorted = selectionSort(myArray);
document.write('<p>Unsorted: ' + String(myArray) + '</p>');
document.write('<p>Sorted: ' + String(sorted) + '</p>');

结果:

enter image description here

这是一些日志的屏幕截图:

enter image description here

我做错了什么导致所有这些undefined出现?

1 个答案:

答案 0 :(得分:3)

问题在这里:

swap(array, i, j);

调用此命令时,jarray.length,因此array[j]undefined,因为您不在数组末尾。

我想你的意思是

swap(array, i, minIndex);
// ------------^^^^^^^^

进行此更改,然后在对“未排序”行进行排序之前而不是之后对数组进行输出:

function selectionSort(array)
{
    let currentMin = 0;
    var minIndex = 0;

    function swap(array, i, j)
    {
        let temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    for(var i = 0; i < array.length - 1; i++)
    {
        console.log(array);
        currentMin = array[i];
        minIndex = i;

        for(var j = i + 1; j < array.length; j++)
        {
            if(array[j] < currentMin)
            {
                currentMin = array[j];
                minIndex = j;
            }
        }

        if(minIndex != i)
        {
            swap(array, i, minIndex);
        }
    }

    console.log(array);

    return array;
}

var myArray = [2, 50, 8, 4, 3, -400, 12, 120];
document.write('<p>Unsorted: ' + String(myArray) + '</p>');
selectionSort(myArray);
document.write('<p>Sorted: ' + String(myArray) + '</p>');


重要的是要了解selectionSort是在数组就地上运行的,它不会创建新的数组。从您的原始代码来看,您似乎认为确实如此:

var myArray = [2, 50, 8, 4, 3, -400, 12, 120];
var sorted = selectionSort(myArray);
document.write('<p>Unsorted: ' + String(myArray) + '</p>');
document.write('<p>Sorted: ' + String(sorted) + '</p>');

sortedmyArray都指向同一个数组(sorted === myArray是正确的),这就是为什么两行在之后 {{1 }},甚至使用“未排序”行。

如果您想返回一个 new 数组,则可以像这样在selectionSort中复制该数组开始:

selectionSort

或者在现代环境中,array = array.slice();

但是,如果要创建一个新数组,则插入排序可能比这种排序算法更有效。 (还有其他用于就地排序的算法,对于大多数输入数据,大多数算法比此算法更有效。)