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 相关文章推荐
鼠标图片振动代码
Jul 06 Javascript
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
javascript arguments使用示例
Dec 16 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
Vue项目中跨域问题解决方案
Jun 05 Javascript
vscode下的vue文件格式化问题
Nov 28 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
Aug 08 Javascript
Openlayers实现扩散的动态点(水纹效果)
Aug 17 Javascript
原生js 实现表单验证功能
Feb 08 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
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
AngularJS Toaster使用详解
2017/02/24 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
Python创建日历实例
2014/08/21 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
EJB的角色和三个对象
2015/12/31 面试题
Hibernate持久层技术
2013/12/16 面试题
机电专业个人求职信范文
2013/12/30 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
校长先进事迹材料
2014/02/01 职场文书
护理中职生求职信范文
2014/02/24 职场文书
乳制品整治工作方案
2014/05/29 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
golang中的空slice案例
2021/04/27 Golang