• 用JS实现快速排序


    "快速排序"的思想很简单,整个排序过程只需要三步:

    (1)在数据集之中,选择一个元素作为"基准"(pivot)。

    (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

    (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其排序呢?

    第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)

    第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。

    第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    我的做法

    function quickSort(arr){
      if(arr.length<1) return arr;
      // 先找个基准点 一般找最中间的元素
      var pivotIndex=Math.floor(arr.length/2);
      //定义两个数组 把小于基准点的 拿到左边 大于基准点的拿到右边
      var pivot=arr[pivot];
      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));
    }

    console.log(quickSort([13,27,0,7,89,11]));
     
    注意!!!此时会报错 Maximum call stack size exceeded
     

    这个错误的中文意思就是“最大堆栈超过了最大值”,一般这种错误也是在递归函数当中出现。

    如果我们要解决问题,那就需要明白错误产生的原因。

    我们先看一个简单的,也能最清楚明白这个问题出现的函数:

     function a() {  

        a(); 

    }  

    只要一运行这个函数,就会直接报上面的那个错误。

    由这个简单的例子,我们就很清楚看出来原因:这就是因为一个函数一直递归调用自己,无法停止,只有在内存被塞满(内存溢出)的时候,报错才能够停止。

    在上面的递归中  我们一直取得var pivot=arr[pivot];  没有判断条件和任何的阻止条件  它会一直调用自己  无法停止

    所以我们要在取中间值的时候用splice方法取值  这样也可以达到减少数组长度的效果  避免了一直递归

    function quickSort(arr){
    if(arr.length<1) return arr;
    // 先找个基准点 一般找最中间的元素
    var pivotIndex=Math.floor(arr.length/2);
    //定义两个数组 把小于基准点的 拿到左边 大于基准点的拿到右边

    // splice(index,howmany)方法向数组中添加/删除项目 该方法返回被删除的项目
    // 注意 该方法直接在数组上作用
    // index    必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
    // howmany  必需。要删除的项目数量。如果设置为 0,则不会删除项目。
    var pivot=arr.splice(pivotIndex,1);
      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));
    }

    console.log(quickSort([13,27,0,7,89,11]));


     
  • 相关阅读:
    让应用通过苹果审核出人头地的10个方法
    正则表达式练习 Regex Golf
    Cocos2d-iOS入门知识详解
    Linux C++/Java/Web/OC Socket网络编程
    JAVA-API Dom4J解析xml/OPML & Rome解析RSS & QRCode编码解码
    李开复:做技术还是管理?
    水两道搜索
    利用HttpClient4进行网络通讯
    hdu5698 百度之星2016round2b第3题
    百度之星2016资格赛D,水题
  • 原文地址:https://www.cnblogs.com/cmy1996/p/9103140.html
Copyright © 2020-2023  润新知