在javascript中使用或不使用pop和shift快速排序是否更快

在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)

我正在关注一些关于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) {
      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))
}