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 相关文章推荐
自动生成文章摘要的代码[JavaScript 版本]
Mar 20 Javascript
URL地址中的#符号使用说明
Feb 12 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
May 06 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
Jul 11 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
Aug 22 Javascript
详谈JavaScript内存泄漏
Nov 14 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
Jun 15 Javascript
jQuery倒计时代码(超简单)
Feb 27 Javascript
node跨域请求方法小结
Aug 25 Javascript
如何使用less实现随机下雪动画详解
Jan 02 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
Feb 10 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
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
Python中查看文件名和文件路径
2017/03/31 Python
python求最大值最小值方法总结
2019/06/25 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python清空命令行方式
2020/01/13 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
运动会广播稿500字
2014/01/28 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
车辆委托书范本
2014/10/05 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
Android实现图片九宫格
2022/06/28 Java/Android
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers