递归插入使用意外堆栈排序

时间:2017-10-23 11:58:44

标签: javascript sorting recursion

我正在尝试以递归方式编写InsertionSort,我想出了以下代码。

function recursiveInsertionSort(array) {
    sort(array, array.length - 1);
}

function sort(array, index) {
    if (index > 0) {
        sort(array, index - 1);
        let j = index - 1;
        let key = array[index];
        while (j >= 0 && array[j] > key) {
            array[j + 1] = array[j];
            j--;
        }
        array[j + 1] = key;
    }
}

此代码运行正常。

例如,如果输入为[4, 1, 3, 2, 16, 9, 10, 14, 8, 7],则返回[1, 2, 3, 4, 7, 8, 9, 10, 14, 16]

在第let key = array[index];行,我只是试图将当前索引的值存储在临时变量中并在循环中使用它。

如果我不将它存储在变量中而是直接使用它,如下面的代码所示,我输出错误,即数组未排序。我不明白为什么它会这样做。即使递归堆栈似乎对我来说也是完美的。但我得到一个奇怪的输出。

function sort(array, index) {
    if (index > 0) {
        sort(array, index - 1);
        let j = index - 1;
        while (j >= 0 && array[j] > array[index]) {
            array[j + 1] = array[j];
            j--;
        }
        array[j + 1] = array[index];
    }
}

例如,如果输入为[4, 1, 3, 2, 16, 9, 10, 14, 8, 7],则返回[ 4, 4, 4, 4, 16, 16, 16, 16, 16, 16 ]

任何人都可以帮我这个吗?这实际上打破了我对递归的理解。

1 个答案:

答案 0 :(得分:1)

第一步更改

array[index]。(jindex - 1时)

j = index -1
array[j+1] = array[j] => array[index]= array[index-1]

因此,如果您未将array[index]保存到key,则在排序时会丢失数据。