我正在尝试以递归方式编写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 ]
。
任何人都可以帮我这个吗?这实际上打破了我对递归的理解。
答案 0 :(得分:1)
array[index]
。(j
为index - 1
时)
j = index -1
array[j+1] = array[j] => array[index]= array[index-1]
因此,如果您未将array[index]
保存到key
,则在排序时会丢失数据。