JavaScript算法系列之快速排序(Quicksort)算法实例详解


Posted in Javascript onSeptember 04, 2016

"快速排序"的思想很简单,整个排序过程只需要三步:

(1)在数据集之中,选择一个元素作为"基准"(pivot)。

(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其排序呢?

第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)

JavaScript算法系列之快速排序(Quicksort)算法实例详解

第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。

JavaScript算法系列之快速排序(Quicksort)算法实例详解

第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

JavaScript算法系列之快速排序(Quicksort)算法实例详解

JavaScript算法系列之快速排序(Quicksort)算法实例详解

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)[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]);


}

}

return quickSort(left).concat([pivot], quickSort(right));
};

使用的时候,直接调用quickSort()就行了。

JavaScript算法系列之快速排序(Quicksort)算法实例详解

以上所述是小编给大家介绍的JavaScript算法系列之快速排序(Quicksort)算法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
jquery中dom操作和事件的实例学习-表单验证
Nov 30 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
Angular路由简单学习
Dec 26 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
Dec 28 Javascript
如何理解Vue的作用域插槽的实现原理
Aug 19 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 Javascript
原生js实现密码强度验证功能
Mar 18 Javascript
vue组件库的在线主题编辑器的实现思路
Apr 03 Javascript
jQuery中ScrollTo用法示例
Sep 04 #Javascript
jQuery与JS加载事件用法分析
Sep 04 #Javascript
jQuery轮播图效果精简版完整示例
Sep 04 #Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
Sep 04 #Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 #Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 #Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
Sep 04 #Javascript
You might like
PHP调用三种数据库的方法(1)
2006/10/09 PHP
PHP新手上路(十三)
2006/10/09 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python实现二分查找算法
2017/09/21 Python
Python扩展内置类型详解
2018/03/26 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
迎接领导欢迎词
2014/01/11 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers