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

(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. vue-注册全局过滤器

    import Vue from 'vue'; import dayjs from 'dayjs'; const filters = { formatDate(date, format = 'YYYY- ...

  2. python实现观察者模式

    python实现观察者模式 前言 有时,我们希望在一个对象的状态改变时更新另外一组对象.在MVC模式中有这样一个非 常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据, ...

  3. oracle获取年、月、日

    --获取年 select extract(year from date'2011-05-17') year from dual; --获取月 select extract(month from dat ...

  4. Linux学习之CentOS(二十六)--Linux磁盘管理:LVM逻辑卷的创建及使用

    在上一篇随笔里面 Linux学习之CentOS(二十五)--Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理,详细的讲解了Linux的动态磁盘管理LVM逻辑卷的基本概念以及LVM的工作原理, ...

  5. 重置Brocade光纤交换机的管理IP地址

     1.使用串口登录光纤交换机 使用RS/232 (9针)串口连接线将笔记本连至交换机的串口. 输入以下参数: Bits per second (每秒位数): 9600 Data Bits (数据位): ...

  6. apache 部署

    <VirtualHost *:80> ServerAdmin webmaster@dummy-host.localhost DocumentRoot "D:/EmpireServ ...

  7. Tensort之uff

    # This sample uses a UFF MNIST model to create a TensorRT Inference Engine from random import randin ...

  8. python核心编程正则表达式练习题1-2匹配由单个空格分隔的任意单词对,也就是性和名

    # 匹配由单个空格分隔的任意单词对,也就是姓和名 import re patt = '[A-Za-z]+ [A-Za-z]+' # 方法一 +加号操作符匹配它左边的正则表达式至少出现一次的情况 # p ...

  9. 洛谷P3374 【模板】树状数组 1&&P3368 【模板】树状数组 2题解

    图片来自度娘~~ 树状数组形如上图,是一种快速查找区间和,快速修改的一种数据结构,一个查询和修改复杂度都为log(n),树状数组1和树状数组2都是板子题,在这里进行详解: 求和: 首先我们看一看这个图 ...

  10. 曝郭盛华公司30万美元收购Acn.ai域名,揭秘人工智能布局下的巨头们

    据域名投资人曝料,郭盛华公司已经提前拿下.ai短域名 Acn.ai,目前域名已经设置跳转到东联科技的官网.都说域名越短越值钱,而且搜索引擎都喜欢更短的域名,例如京东更换的域名“jd.com”交易价格约 ...