zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    NSString 处理
    我的第一个IOSDemo
    NSArray创建和使用
    NSDate
    NSDictionary
    flash全屏代码
    getBounds
    运用递归随机出与上一个数不重复的数
    标签跟随鼠标移动
    保存数据到本地
  • 原文地址:https://www.cnblogs.com/forlong/p/9138635.html
Copyright © 2011-2022 走看看