JavasScript 实现二分法快排注意点

JavaScript 实现快排如下:

function quickSort(arr) {
    if(arr.length<=1) {return arr};
      var pivotIndex = Math.floor(arr.length/2);
      var pivot = arr.splice(pivotIndex, 1)[0];
      var left = [];
      var right = [];
      for(var i=0;i<arr.length;i++) {
          if(arr[i]<pivot) {
              left.push(arr[i])
          } else{
            right.push(arr[i])
        }
    };
    return quickSort(left).concat([pivot],quickSort(right));
}

有几点需要注意:

1.若定义变量 var len = arr.length ,并用len代替所有arr.length,会变成死循环。

   原因  splice 会改变原数组长度,在一开始定义的len 与经过splice之后的 arr.length 长度是不相等的。(在本案例中会相差1,因为从arr中抽出了一位。)

2.二分法里找中间点pivot 

 直接 var pivot = arr[pivotIndex] 得到的 piovt 值似乎与 var pivot = arr.splice(pivotIndex, 1)[0] 完全一样,但在上面写法里不能相互替换,否则会出现死循环。

 原因还是 splice 会改变原数组长度,上面快排方法是基于splice改变了数组长度来实现的。

 

参考链接:http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html

posted @ 2018-06-05 11:00  王利r  阅读(162)  评论(0编辑  收藏  举报