JavaScript 快速排序详解
使用的是《JavaScript数据结构与算法》一书中的快速排序,并加上自己的理解。
经测试,此算法的速度比内置的 sort 更快!而阮一峰的那个快排更像是归并排序,虽然写法简单很多,但是性能很差,数组太大还会爆栈。
// 原理:快速排序也使用分治的方法,将原始数组分为较小的数组(但它没有像归并排序那样将它们分割开)
// 1、从数组中选择中间一项作为主元
// 2、创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之前,而比主元大的值都排在主元之后。这一步叫作划分操作。
// 3、接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的子数组)重复之前的两个步骤,直至数组已完全排序。
const quickSort = (arr) => {
// 排序算法。每次接收的都是整个 arr,只是 left 和 right 在改变。每次排序只是对 left 和 right 之间的数进行排序
const quick = (arr, left, right) => {
let index; // 分割数组的索引
if (arr.length > 1) {
// 核心算法:两边指针往中间移,从左边找到比主元大的数,右边找到比主元小的数,然后交换两个数
let mid = Math.floor((left + right) / 2), // 选择中间项作为主元
midNum = arr[mid];
l = left, // 初始化两个指针
r = right;
console.log(arr, l, r, mid, midNum);
// 左指针比右指针小才执行
while (l <= r) {
// 从左侧开始找,找到一个比主元大的数
while (arr[l] < midNum) {
l++;
}
// 从右侧开始找,找到一个比主元小的数
while (arr[r] > midNum) {
r--;
}
// 如果比主元大的数的索引小于比主元小的数的索引,则交换这两个数
if (l <= r) {
[arr[l], arr[r]] = [arr[r], arr[l]];
// 交换完成,移动指针
l++;
r--;
}
}
index = l; // 以上执行完成后,左指针左边的数都是较小的数,右边的数都是较大的数。我们把左指针作为分割数组的索引 // 左索引小于分割索引,则对数组中左索引到分割索引部分进行排序
if (left < index - 1) {
quick(arr, left, index - 1);
}
// 右索引大于分割索引,则对数组中分割索引到右索引部分进行排序
if (index < right) {
quick(arr, index, right);
}
}
}
// 调用 quick 进行排序,因为是要对整个数组排序,所以传入 0 和 arr.length - 1
quick(arr, 0, arr.length - 1);
} let arr = [];
for (let i = 0; i < 10; i++) {
arr.push(Math.floor(Math.random() * 100));
}
console.time();
quickSort(arr);
// arr.sort(arr);
console.timeEnd();
JavaScript 快速排序详解的更多相关文章
- JavaScript事件详解-jQuery的事件实现(三)
正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...
- JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】
正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- JavaScript事件详解-zepto的事件实现
zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...
- javascript 函数详解2 -- arguments
今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...
- [原创]JavaScript继承详解
原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...
- javaScript基础详解(1)
javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...
- javascript设计模式详解之命令模式
每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...
随机推荐
- 在pycharm中运行python程序
安装PyCharm 安装过程取决于您的操作系统: 在Windows上安装PyCharm 运行.exe您已下载的文件,并按照PyCharm安装向导的说明进行操作. 在macOS上安装PyCharm 打开 ...
- datatables弹窗报错信息屏蔽方法
在使用datatables的时候,总是会弹出这样的warning: Error: DataTables warning: table id=data_table- Requested unknown ...
- guxh的python笔记八:特殊方法
1,类的特殊方法 新建一个类,本章内容中的特殊方法如果不创建类或新增方法,默认使用的就是下面的类: class Foo: """this is Foo"&q ...
- jquery+jquery.rotate实现图片旋转效果
首先要下载jquery.min.js 和jquery.rotate.js文件 1.下载地址: https://www.jb51.net/jiaoben/554113.html 2.导入文件 <s ...
- 匿名函数lambda及面试题三道
# 函数名 = lambda 参数 :返回值. 匿名函数只是函数,如果要通过可迭代对象给匿名函数传参,就需要使用 map 或者 filter calc = lambda n:n**n calc(1)c ...
- Python中的装饰器的简单介绍01
一. 装饰器是什么? 简单来说,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问. 二.装饰器语法 (1)无参数装 ...
- Python-接口自动化(一)
python基础知识(一) 一.python语言特点 1.易于学习:python有相对较少的关键字,结构简单,有一个明确定义的语法,学起来比较简单: 2.易于阅读:python代码定义的更清晰: 3. ...
- [Oracle][RAC]Oracle RAC环境里打OCW上的个别Patch,然后Rollback,发现OCW也被Rollback掉了
对于Oracle RAC来说,存在着DB层面的Patch,也存在着GI层面的Patch. 本文介绍的是,GI层面,打Patch----> rollback 的动作之后,原来的OCW被Rollba ...
- MySQL-8.0.15在Win10和Ubuntu上安装&使用
一.Windows环境下安装: 1.下载MySQL压缩包 官网地址:https://dev.mysql.com/downloads/mysql/ 点击直接下载: 2.解压到本地目录,并添加一个配置文件 ...
- 精确值避免使用float和double,使用BigDecimal
实现将double类型的值转换为BigDecimal类型的值的不同途径以及各途径间的区别 一:有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal ...