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 相关文章推荐
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
jquery $.getJSON()跨域请求
Dec 21 Javascript
Javascript 页面模板化很多人没有使用过的方法
Jun 05 Javascript
javascript仿qq界面的折叠菜单实现代码
Dec 12 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
js数组的操作指南
Dec 28 Javascript
javascript事件冒泡实例分析
May 13 Javascript
JavaScript 节流函数 Throttle 详解
Jul 04 Javascript
JS实现物体带缓冲的间歇运动效果示例
Dec 22 Javascript
关于Stream和Buffer的相互转换详解
Jul 26 Javascript
使用async await 封装 axios的方法
Jul 09 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
python reduce 函数使用详解
2017/12/05 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
python实现学生成绩测评系统
2020/06/22 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
现场施工员岗位职责
2014/03/10 职场文书
无偿献血倡议书
2014/04/14 职场文书
师德师风剖析材料
2014/09/30 职场文书
文明班级申报材料
2014/12/24 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python