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

(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. html元素标签时间格式化

    <fmt:formatDate value="${user.loginTime}" pattern="yyyy-MM-dd HH:mm:ss"/>

  2. EditPlus 好看的monaco主题

    版本: editplus 4.3效果图:-------- 在editplus配置目录下,找到editplus_u.ini,替换为以下代码:------------------------------- ...

  3. vue.js(5)--事件修饰符

    vue中的事件修饰符(.stop..prevent..self..capture..once) (1)实例代码 <!DOCTYPE html> <html lang="en ...

  4. MathType 7.4.2.480

    目录 1. 相关推荐 2. 按 3. 软件介绍 4. 安装步骤 5. 使用说明 6. 下载地址 1. 相关推荐 推荐使用:AxMath(AxMath可以与LaTeX进行交互):https://blog ...

  5. TensorFlow——LSTM长短期记忆神经网络处理Mnist数据集

    1.RNN(Recurrent Neural Network)循环神经网络模型 详见RNN循环神经网络:https://www.cnblogs.com/pinard/p/6509630.html 2. ...

  6. keepalived启动后报错:(VI_1): received an invalid passwd!的解决办法

    一.配置好keepalived.conf文件后,启动keepalived,查看/var/log/message日志报错: [root@push-- sbin]# tail -f /var/log/me ...

  7. javaIO--File类

    IO:File类 位于java.io包下,用于表示与平台无关的文件和目录File类可以用来操作文件和目录,但是不能用来访问文件的内容. 1.构造方法 File(String pathName)通过将给 ...

  8. [SpringBoot] 通过spring.factory文件来加载第三方的bean

        在springboot的开发过程中,我们经常需要加载一些bean,如果bean使我们自己写的类,那很好办,加个@Component注解就搞定了,然后过程启动会扫描启动类所在的包及其子包,如果我 ...

  9. 【regex】POSIX标准正则表达式库

    在linux C 下面没有编译成功使用?号的非贪婪模式. 网上的一句话:the ? only works for Perl-based regexp, not for POSIX... 如果需要使用非 ...

  10. Redis :Linux和Window查看版本号

    一.Linux版本:查看服务端版本 **二者都可以** redis-server -v redis-server --version 查看客户端版本 **二者都可以** redis-cli -v re ...