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 相关文章推荐
打开超链需要“确认”对话框的方法
Mar 08 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
js变量、作用域及内存详解
Sep 23 Javascript
domReady的实现案例
Nov 23 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
angularJs 表格添加删除修改查询方法
Feb 27 Javascript
解决vue 引入子组件报错的问题
Sep 06 Javascript
angularJS自定义directive之带参方法传递详解
Oct 09 Javascript
ES6顶层对象、global对象实例分析
Jun 14 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 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
多重?l件?合查?(二)
2006/10/09 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python中time包实例详解
2021/02/02 Python
分布式数据库需要考虑哪些问题
2013/12/08 面试题
优秀党务工作者事迹材料
2014/05/07 职场文书
企业晚会策划方案
2014/05/29 职场文书
大学生就业自荐书
2014/06/16 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
高二化学教学反思
2016/02/22 职场文书
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python