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背投广告代码的完善
Apr 08 Javascript
网页上的Javascript编辑器和代码格式化
Apr 25 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
Jul 28 Javascript
javascript中怎么做对象的类型判断
Nov 11 Javascript
jQuery数据类型小结(14个)
Jan 08 Javascript
JQuery导航菜单选择特效
Apr 11 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
May 04 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
JS去掉字符串中所有的逗号
Oct 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
基于simple_html_dom的使用小结
2013/07/01 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
PHP中SESSION过期设置
2021/03/09 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python版本五子棋的实现代码
2018/12/11 Python
详解Python字典的操作
2019/03/04 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
python中class的定义及使用教程
2019/09/18 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
致跳远运动员加油稿
2014/02/11 职场文书
王老吉广告词
2014/03/20 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
班级年度安全计划书
2014/05/01 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript