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 相关文章推荐
jQuery学习笔记之jQuery的动画
Dec 22 Javascript
MultiSelect左右选择控件的设计与实现介绍
Jun 08 Javascript
将json对象转换为字符串的方法
Feb 20 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
一款由jquery实现的整屏切换特效
Sep 15 Javascript
jQuery中:contains选择器用法实例
Dec 30 Javascript
Angular中的Promise对象($q介绍)
Mar 03 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
Oct 11 Javascript
Angular之toDoList的实现代码示例
Dec 02 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
Jun 08 Javascript
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
ES6如何用一句代码实现函数的柯里化
Jan 18 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
PHP高级OOP技术演示
2009/08/27 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
台湾最大网路书店:博客来
2018/03/18 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
修理厂厂长岗位职责
2014/01/30 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
高中教师考核方案
2014/05/18 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
公司市场部岗位职责
2015/04/15 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
美元符号 $
2022/02/17 杂记
分享python函数常见关键字
2022/04/26 Python