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 相关文章推荐
window.parent调用父框架时 ie跟火狐不兼容问题
Jul 30 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
Jan 24 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
May 20 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
Nov 28 Javascript
Angular网络请求的封装方法
May 22 Javascript
基于bootstrap页面渲染的问题解决方法
Aug 09 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
Jul 29 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
Sep 10 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
Jul 24 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
PHP获取网站域名和地址的代码
2008/08/17 PHP
php 高效率写法 推荐
2010/02/21 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
基于vue 实现token验证的实例代码
2017/12/14 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
python脚本实现统计日志文件中的ip访问次数代码分享
2014/08/06 Python
Python常用模块用法分析
2014/09/08 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
python实现websocket的客户端压力测试
2019/06/25 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
pymysql的简单封装代码实例
2020/01/08 Python
函授毕业生的自我鉴定
2013/11/26 职场文书
教学实习自我评价
2014/01/28 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
和睦家庭事迹
2014/05/14 职场文书
2014年手术室工作总结
2014/11/26 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
防卫过当辩护词
2015/05/21 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
react中的DOM操作实现
2021/06/30 Javascript
python双向链表实例详解
2022/05/25 Python