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 相关文章推荐
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
利用jquery包将字符串生成二维码图片
Sep 12 Javascript
浅谈JSON.parse()和JSON.stringify()
Jul 14 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
Aug 05 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
基于jQuery ztree实现表格风格的树状结构
Aug 31 jQuery
Bootstrap4 gulp 配置详解
Jan 06 Javascript
node删除、复制文件或文件夹示例代码
Aug 13 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 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
php生成扇形比例图实例
2013/11/06 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
Javascript 布尔型分析
2008/12/22 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
python 二维数组90度旋转的方法
2019/01/28 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
python 调整图片亮度的示例
2020/12/03 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
软件测试企业面试试卷
2016/07/13 面试题
师范生的个人求职信范文
2014/01/04 职场文书
亲子读书活动方案
2014/02/22 职场文书
安全生产活动月方案
2014/03/09 职场文书
党支部换届选举方案
2014/05/08 职场文书
聘任合同书
2015/09/21 职场文书
青年教师听课心得体会
2016/01/15 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技