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 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
js滚动条多种样式,推荐
Feb 05 Javascript
javascript之锁定表格栏位
Jun 29 Javascript
跟着JQuery API学Jquery 之三 筛选
Apr 09 Javascript
分享20款好玩的jQuery游戏
Apr 17 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
jquery 3D 标签云示例代码
Jun 12 Javascript
jQuery中removeData()方法用法实例
Dec 27 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
May 03 Javascript
Js中使用正则表达式验证输入是否有特殊字符
Sep 07 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 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 更新数据库中断的解决方法
2009/06/05 PHP
php连接数据库代码应用分析
2011/05/29 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python标准库之sqlite3使用实例
2014/11/25 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Django中Model的使用方法教程
2018/03/07 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
django form和field具体方法和属性说明
2020/07/09 Python
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
生育关怀行动实施方案
2014/03/26 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
写景作文评语集锦
2014/12/25 职场文书
小学教师教学随笔
2015/08/14 职场文书
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏