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 相关文章推荐
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
js修改table中Td的值(定义td的双击事件)
Jan 10 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
jQuery中prevUntil()方法用法实例
Jan 08 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
BootStrap3中模态对话框的使用
Jan 06 Javascript
Vuejs 组件——props数据传递的实例代码
Mar 07 Javascript
在一个页面实现两个zTree联动的方法
Dec 20 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
浅谈vue方法内的方法使用this的问题
Sep 15 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中使用Oracle数据库(2)
2006/10/09 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
如何在Python对Excel进行读取
2020/06/04 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
先进集体获奖感言
2014/02/13 职场文书
学校节能减排倡议书
2014/05/16 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
教师工作总结范文2014
2014/11/10 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
2019 入党申请书范文
2019/07/10 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
DSP接收机前端设想
2022/04/05 无线电
apache ftpserver搭建ftp服务器
2022/05/20 Servers