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

(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]));
 

用JS实现快速排序的更多相关文章

  1. JS实现快速排序,冒泡排序

    JS-排序详解-冒泡排序   说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b, ...

  2. js算法-快速排序(Quicksort)

    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...

  3. js实现快速排序(in-place)简述

    快速排序,又称划分交换排序.以分治法为策略实现的快速排序算法. 本文主要要谈的是利用javascript实现in-place思想的快速排序 分治法: 在计算机科学中,分治法是建基于多项分支递归的一种很 ...

  4. JS排序--快速排序

    用 JavaScript 实现快速排序代码如下: /* * @author liphong * @data 2019/02/24 */ var arr = []; // 需要被排序数组 /* * 分离 ...

  5. js数组快速排序/去重

    数组的排序  快速排序 思路: (1)在数据集之中,选择一个元素作为”基准”(pivot). (2)所有小于”基准”的元素,都移到”基准”的左边:所有大于”基准”的元素,都移到”基准”的右边. (3) ...

  6. js数组快速排序和冒泡排序

    1.快速排序 var arr = [1, 2, 5, 6, 3, 1, 4]; function mySort(arr) { if (arr.length <= 1) { return arr; ...

  7. js实现快速排序

    非原创: var quickSort = function(arr){ if(arr.length<=1){return arr;} var pivotIndex = Math.floor(ar ...

  8. js数组快速排序

    <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; function quick ...

  9. JS实现快速排序算法

    以下贴出两种实现方式,结果一样,但有些许的差别: 第一种: <script type="text/javascript"> var arr=[6,7,8,3,4,5,9 ...

随机推荐

  1. 在springmvc中使用requestContextListener获取全部的request对象

    RequestContextListener实现了 ServletRequestListener ,在其覆盖的requestInitialized(ServletRequestEvent reques ...

  2. HashMap 的实现原理(1.8)

    详见:https://blog.csdn.net/richard_jason/article/details/53887222 HashMap概述 1.初始容量默认为16 最大为2的30次方,负载因子 ...

  3. func_get_args func_num_args 的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用: func_num_args一般写在方法中,用于计数 function eeee($a='gg ...

  4. svn 服务器的搭建以及客户端的使用

    1.svn 服务器的搭建以及客户端的使用,安装见下面的博客 https://blog.csdn.net/zh123456zh789/article/details/80921179 说明:服务器只是用 ...

  5. idea 新手入门配置

    1.配置新建类时,创建者信息 2.配置svn 1. 在idea中不显示无用的内容,配置如下  .hprof;.iml;.pyc;.pyo;.rbc;.yarb;~;.DS_Store;.git;.hg ...

  6. SpringMVC POJO传参方式

    有两POJO类 Address.java package com.proc; public class Address { private String province; private Strin ...

  7. python大佬养成计划----HTML网页设计(表格)

    制作网页时,要合理规划网页布局.比如,在网页中添加一个表格,可分为上.中.下三部分,上部存放网页标题或LOGO图片,中间部分是整个网页的主体内容,底部就是相关制作信息.此外,单元格里还可再添加单元格, ...

  8. null 的应用

    它是 Oracle 中非常特殊的一种类型.它表示不确定,表示没有值.并且它能转化成所有的类型. 向数据库中插入空字符串时,oracle 会把它自动转化为 null 类型.所以,在查询空字符的时候: s ...

  9. SSH加密传输

    数据传输安全的要满足的要求: (1)消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密) (2)消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息 ...

  10. 任意修改网页内容JS代码

    浏览器输入框执行,chrome需要粘贴后,需要在前面手打javascript: 因为粘贴的会自动过滤 javascript:document.body.contentEditable='true'; ...