使用的是《JavaScript数据结构与算法》一书中的快速排序,并加上自己的理解。

经测试,此算法的速度比内置的 sort 更快!而阮一峰的那个快排更像是归并排序,虽然写法简单很多,但是性能很差,数组太大还会爆栈。

  1. // 原理:快速排序也使用分治的方法,将原始数组分为较小的数组(但它没有像归并排序那样将它们分割开)
  2. // 1、从数组中选择中间一项作为主元
  3. // 2、创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之前,而比主元大的值都排在主元之后。这一步叫作划分操作。
  4. // 3、接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的子数组)重复之前的两个步骤,直至数组已完全排序。
  5. const quickSort = (arr) => {
  6. // 排序算法。每次接收的都是整个 arr,只是 left 和 right 在改变。每次排序只是对 left 和 right 之间的数进行排序
  7. const quick = (arr, left, right) => {
  8. let index; // 分割数组的索引
  9. if (arr.length > 1) {
  10. // 核心算法:两边指针往中间移,从左边找到比主元大的数,右边找到比主元小的数,然后交换两个数
  11. let mid = Math.floor((left + right) / 2), // 选择中间项作为主元
  12. midNum = arr[mid];
  13. l = left, // 初始化两个指针
  14. r = right;
  15. console.log(arr, l, r, mid, midNum);
  16. // 左指针比右指针小才执行
  17. while (l <= r) {
  18. // 从左侧开始找,找到一个比主元大的数
  19. while (arr[l] < midNum) {
  20. l++;
  21. }
  22. // 从右侧开始找,找到一个比主元小的数
  23. while (arr[r] > midNum) {
  24. r--;
  25. }
  26. // 如果比主元大的数的索引小于比主元小的数的索引,则交换这两个数
  27. if (l <= r) {
  28. [arr[l], arr[r]] = [arr[r], arr[l]];
  29. // 交换完成,移动指针
  30. l++;
  31. r--;
  32. }
  33. }
  34. index = l; // 以上执行完成后,左指针左边的数都是较小的数,右边的数都是较大的数。我们把左指针作为分割数组的索引
  35.  
  36. // 左索引小于分割索引,则对数组中左索引到分割索引部分进行排序
  37. if (left < index - 1) {
  38. quick(arr, left, index - 1);
  39. }
  40. // 右索引大于分割索引,则对数组中分割索引到右索引部分进行排序
  41. if (index < right) {
  42. quick(arr, index, right);
  43. }
  44. }
  45. }
  46. // 调用 quick 进行排序,因为是要对整个数组排序,所以传入 0 和 arr.length - 1
  47. quick(arr, 0, arr.length - 1);
  48. }
  49.  
  50. let arr = [];
  51. for (let i = 0; i < 10; i++) {
  52. arr.push(Math.floor(Math.random() * 100));
  53. }
  54. console.time();
  55. quickSort(arr);
  56. // arr.sort(arr);
  57. console.timeEnd();

JavaScript 快速排序详解的更多相关文章

  1. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  2. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  3. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  4. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  5. JavaScript事件详解-zepto的事件实现

    zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...

  6. javascript 函数详解2 -- arguments

    今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...

  7. [原创]JavaScript继承详解

    原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...

  8. javaScript基础详解(1)

    javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...

  9. javascript设计模式详解之命令模式

    每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...

随机推荐

  1. (转载)基于Unity~UGUI的简单UI框架(附UIFramework源码)

    此博客跟随siki老师的课程笔记生成,感谢siki老师的辛勤付出! 此框架功能较简单,适用于学习,可以很好的锻炼我们的设计思想 框架源码地址: UIFramework litjson.dll下载地址: ...

  2. LINQ之路12:LINQ Operators之数据转换(Projecting)

    本篇继续LINQ Operators的学习,这里我们讨论的是数据转换的两种方式:Select和SelectMany,看似简单常用的两种运算符,却也大有讲究.我们会在本篇详细介绍他们的使用方式和适用的场 ...

  3. CSP中的选择

    P ∩ Q (P or Q) 由机器做出选择,环境无法控制,设计软件时只实现一个即可 P[]Q一般选择(Genral choice) 环境可以控制选择P或Q,若P不可接受这个动作,则执行Q,若Q不可接 ...

  4. Confluence 6 安装指南

    在你开始之前 在你开始安装 Confluence 之前,请确定你的安装环境满足 最小系统安装要求和支持的平台. 如果你计划将你的 Confluence 运行到虚拟环境下,请参考 Running Con ...

  5. SQL SERVER 查看sql语句性能与执行时间

    [方法一] set statistics profile on set statistics io on set statistics time on go --sql语句 go set statis ...

  6. Codeforces Beta Round #94 (Div. 1 Only)B. String sam

    题意:给你一个字符串,找第k大的子字符串.(考虑相同的字符串) 题解:建sam,先预处理出每个节点的出现次数,然后处理出每个节点下面的出现次数,然后在dfs时判断一下往哪边走即可,注意一下num会爆i ...

  7. MySQL三层循环

    begindeclare i int;  #定义i变量declare j int;  #定义j变量declare k int;  #定义k变量set i=1;set j=1;set k=1;while ...

  8. liunx 安装mysql数据库

      yum 安装rz/sz yum install -y lrzsz 卸载Mariadb数据库 查询所安装的MariaDB组件: [root@localhost logs]# rpm -qa | gr ...

  9. nisght heap increase

    sudo gedit /usr/local/cuda-5.5/libnsight/nsight.ini --launcher.defaultActionopenFile-vm../jre/bin/ja ...

  10. 31 位域、空类的sizeof值

    1 分析下列程序: #include<iostream> using namespace std; struct s { int x: 3; int y: 4; int z: 5; dou ...