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 相关文章推荐
JS 自动完成 AutoComplete(Ajax 查询)
Jul 07 Javascript
javascript 导出数据到Excel(处理table中的元素)
Dec 18 Javascript
javascript 学习笔记(八)javascript对象
Apr 12 Javascript
js和jQuery设置Opacity半透明 兼容IE6
May 24 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
使用 bootstrap modal遇到的问题小结
Nov 09 Javascript
基于JavaScript实现带缩略图的轮播效果
Jan 12 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
Oct 27 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
Dec 11 Javascript
Vue 组件修改根实例的数据的方法
Apr 02 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中phar包的使用教程
2017/06/14 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
python字符类型的一些方法小结
2016/05/16 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
python 重命名轴索引的方法
2018/11/10 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
理财投资建议书
2014/03/12 职场文书
库房保管员岗位职责
2014/04/07 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
向女朋友道歉的话
2015/01/20 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
详解Python中__new__方法的作用
2022/03/31 Python