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 相关文章推荐
javascript 原型模式实现OOP的再研究
Apr 09 Javascript
jQuery 渐变下拉菜单
Dec 15 Javascript
JavaScript 模拟用户单击事件
Dec 31 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
layui弹出层效果实现代码
May 19 Javascript
Vue.js中组件中的slot实例详解
Jul 17 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
Aug 13 Javascript
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
JS实现扫雷项目总结
May 19 Javascript
angular异步验证器防抖实例详解
Mar 31 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
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
常用的jQuery前端技巧收集
2014/12/24 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
React 组件间的通信示例
2018/06/14 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python logging添加filter教程
2019/12/24 Python
python range实例用法分享
2020/02/06 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
美国眼镜网站:LensCrafters
2020/01/19 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
红色故事演讲稿
2014/05/22 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
MySQL索引是啥?不懂就问
2021/07/21 MySQL
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL