我编写了一个带有两个循环的排序算法(插入排序)但是我发现当第二个循环的条件是
时j> 0&&价值< inputArray [j - 1]
循环比条件
时运行得更快值< inputArray [j - 1]&& j> 0
这是由我的计算机上的Node.JS编写和运行的。
const makeEmptyArrayOfSize = function(targetArray, targetSize){
console.time('ArrayMakingTime')
for(let i = 0;i<targetSize;i++){
targetArray.push(Math.floor(Math.random() * targetSize))
}
console.timeEnd('ArrayMakingTime')
return targetArray
}
const slowerSort = (inputArray) => {
console.time('slowerSort for ' + inputArray.length + ' records')
for(let i = 0;i<inputArray.length;i++){
let value = inputArray[i]
let j = i
for(;value < inputArray[j - 1] && j > 0;j--){
inputArray[j] = inputArray[j - 1]
}
inputArray[j] = value
}
console.timeEnd('slowerSort for ' + inputArray.length + ' records')
return inputArray
}
const fasterSort = (inputArray) => {
console.time('fasterSort for ' + inputArray.length + ' records')
for(let i = 0;i<inputArray.length;i++){
let value = inputArray[i]
let j = i
for(;j > 0 && value < inputArray[j - 1];j--){
inputArray[j] = inputArray[j - 1]
}
inputArray[j] = value
}
console.timeEnd('fasterSort for ' + inputArray.length + ' records')
return inputArray
}
let dummyArray = makeEmptyArrayOfSize([], 10000)
let dummyArrayCopy = dummyArray.slice(0)
slowerSort(dummyArray)
fasterSort(dummyArrayCopy)
正如您在上面的代码段中所看到的,fastSort和slowSort之间的唯一区别是 AND (&amp;&amp;)条件在第二个 for 循环中的位置然而,他们评估时间上的巨大差异。
答案 0 :(得分:0)
我可以看到两件事正在发挥重要作用:
1)在较慢的版本中,只需更改一些代码,例如
let m = inputArray[j - 1];
for (; value < m && j > 0; j--) {
inputArray[j] = m
}
现在您会发现结果有所不同.JavaScript数组与我们在服务器端语言(如c#)中看到的不同,其中从数组中读取的是O(1),在JavaScript数组中只是对象的扩展
2)注释中提到的另一个是短路评估。