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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
Jan 11 Javascript
jquery多浏览器捕捉回车事件代码
Jun 22 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
js添加table的行和列 具体实现方法
Jul 22 Javascript
简体中文转换繁体中文(实现代码)
Dec 25 Javascript
返回上一页并自动刷新的JavaScript代码
Feb 19 Javascript
javascript编写简易计算器
May 06 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
Jan 04 Javascript
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
原生js实现无缝轮播图
Jan 11 Javascript
vue实现滑动解锁功能
Mar 03 Vue.js
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
Linux下php5.4启动脚本
2014/08/03 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python可视化实现KNN算法
2019/10/16 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
软件工程师面试题
2012/06/25 面试题
薪酬专员岗位职责
2014/02/18 职场文书
社团活动总结
2014/04/28 职场文书
物流专业自荐信
2014/05/23 职场文书
医院标语大全
2014/06/23 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
青岛海底世界导游词
2015/02/11 职场文书
护士年终个人总结
2015/02/13 职场文书
芙蓉镇观后感
2015/06/10 职场文书
反邪教学习心得体会
2016/01/15 职场文书
个人道歉信大全
2019/04/11 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
win10清理dns缓存
2022/04/19 数码科技