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


     
  • 相关阅读:
    C# Http方式下载文件到本地
    C#中如何让ListView控件点击选中整行
    C#中toolStrip或statusStrip遮挡了SplitContainer怎么办?
    C# 判断字符串是否符合十六进制,八进制,二进制和十进制整数格式的正则表达式
    从零讲JAVA ,给你一条清晰地学习道路!该学什么就学什么!!
    Java or Python?初学者的选择
    从Java的前景与就业情况看,Java是你首选的编程语言,没有之一
    好书推荐:Java与模式.pdf
    java多线程、集合和IO面试题_02
    走出创业过程中悲伤的低谷
  • 原文地址:https://www.cnblogs.com/cmy1996/p/9103140.html
Copyright © 2011-2022 走看看