Javascript实现快速排序(Quicksort)的算法详解


Posted in Javascript onSeptember 06, 2015

目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。

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

(1)在数据集之中,选择一个元素作为"基准"(pivot)。

(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其排序呢?

第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)

Javascript实现快速排序(Quicksort)的算法详解

第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。

Javascript实现快速排序(Quicksort)的算法详解

第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

Javascript实现快速排序(Quicksort)的算法详解

下面参照网上的资料,用Javascript语言实现上面的算法。

首先,定义一个quickSort函数,它的参数是一个数组。

var quickSort = function(arr) {
};

然后,检查数组的元素个数,如果小于等于1,就返回。

var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
};

接着,选择"基准"(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集。

var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }

var pivotIndex = Math.floor(arr.length / 2) ;

var pivot = arr.splice(pivotIndex, 1)[0];

var left = [];

var right = [];
};

然后,开始遍历数组,小于"基准"的元素放入左边的子集,大于基准的元素放入右边的子集。

var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }

var pivotIndex = Math.floor(arr.length / 2) ;

var pivot = arr.splice(pivotIndex, 1)[0];

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


}

}
};

最后,使用递归不断重复这个过程,就可以得到排序后的数组。

var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }

var pivotIndex = Math.floor(arr.length / 2);

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));
};
 
var dataArray = [85,24,63,45,17,31,96,50];
console.log(dataArray.join(","));
console.log(quickSort(dataArray).join(","));

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
兼容IE与firefox火狐的回车事件(js与jquery)
Oct 20 Javascript
window.dialogArguments 使用说明
Apr 11 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
JavaScript中的变量作用域介绍
Dec 31 Javascript
jQuery中add()方法用法实例
Jan 08 Javascript
js生成随机数的过程解析
Nov 24 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
vue下使用nginx刷新页面404的问题解决
Aug 02 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
Aug 12 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
简单谈谈javascript Date类型
Sep 06 #Javascript
Js制作点击输入框时默认文字消失的效果
Sep 05 #Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
Sep 05 #Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 #Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 #Javascript
javascript中日期函数new Date()的浏览器兼容性问题
Sep 05 #Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
Sep 05 #Javascript
You might like
虫族 Zerg 热键控制
2020/03/14 星际争霸
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
vue实现通讯录功能
2018/07/14 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
教你使用python画一朵花送女朋友
2018/03/29 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
安全施工责任书
2014/08/25 职场文书
python实现简单区块链结构
2021/04/25 Python
python cv2图像质量压缩的算法示例
2021/06/04 Python
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js