在javascript中使用或不使用pop和shift快速排序是否更快
我正在关注一些关于javascript算法的视频,发现讲师使用类似于以下代码的代码实现了快速排序:在javascript中使用或不使用pop和shift快速排序是否更快,javascript,optimization,Javascript,Optimization,我正在关注一些关于javascript算法的视频,发现讲师使用类似于以下代码的代码实现了快速排序: function quickSort(arr){ if(arr.length <= 1) return arr const pivot = arr[arr.length - 1] let left = [] let right = [] for(let i = 0; i < arr.length-1; i++){ if (arr[i] < pivot)
function quickSort(arr){
if(arr.length <= 1) return arr
const pivot = arr[arr.length - 1]
let left = []
let right = []
for(let i = 0; i < arr.length-1; i++){
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return [].concat(quickSort(left),pivot,quickSort(right))
}
函数快速排序(arr){
if(arr.length
有人能告诉我使用pop或shift的问题吗
我认为问题在于,使用pop
和/或shift
修改输入数组比简单地从中读取元素更昂贵。每个shift
尤其可能并且可能会花费O(N),尽管原则上这取决于实现
请注意,push
ing到新的每个分区数组中也可能会产生一些不必要的成本。至少,它会比传统的快速排序实现产生更多的内存开销,而传统的快速排序实现会将输入数组排序到位
有人能告诉我使用pop或shift的问题吗
我认为问题在于,使用pop
和/或shift
修改输入数组比简单地从中读取元素更昂贵。每个shift
尤其可能并且可能会花费O(N),尽管原则上这取决于实现
请注意,push
ing到新的每个分区数组中也可能会产生一些不必要的成本。至少,它会比传统的快速排序实现产生更多的内存开销,后者会对输入数组进行适当的排序。为什么不试试看呢?您的代码是O(N^2*logN)
(因为Array.prototype.shift
是线性的),他们的代码是O(N*logN)
@MikeMcCaughan谢谢,书签。当然,你还应该检查你的版本是否产生了正确的结果。@zerkms本身就是一个耗时的移位过程。你为什么不试试看呢?你的代码是O(N^2*logN)
(因为Array.prototype.shift
是线性的),他们的代码是O(N*logN)
@MikeMcCaughan,谢谢,书签。当然,你也应该检查你的版本是否产生了正确的结果。@zerkms本身就是移位的时间消耗吗?@le_m这是标准和V8中对它的定义。还可以看到“can”字+“虽然原则上这取决于实现”。@leum--这是标准定义它的方式。它是线性的。我不确定我在这里明白你的意思。@leum我没有说任何关于运行时性能的事情(实际上是你),对不起。我说的是“这是标准和V8中定义它的方式。”“。两者都是线性的。你在这里的观点是什么?@le_m这是标准和V8中的定义。也可以看到“可以”字+,虽然原则上取决于实现。@le_m--这是标准定义它的方式。它是线性的。我不确定我在这里看到你的观点。@le_m我没有说任何关于运行时性能的事情。”(实际上是你),对不起。我说“这就是标准和V8中的定义”。两者都是线性的。你的观点是什么?
function quickSort(arr){
if(arr.length <= 1) return arr
const pivot = arr.pop()
let left = []
let right = []
while(arr[0]){
if (arr[0] < pivot) {
left.push(arr.shift())
} else {
right.push(arr.shift())
}
}
return [].concat(quickSort(left),pivot,quickSort(right))
}