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基本语法分析说明
Jun 15 Javascript
js函数调用的方式
May 06 Javascript
jQuery源码解读之removeAttr()方法分析
Feb 20 Javascript
jQuery定义背景动态切换效果的方法
Mar 23 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
Sep 14 Javascript
javascript+css3 实现动态按钮菜单特效
Feb 06 Javascript
jQuery Ajax请求后台数据并在前台接收
Dec 10 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 Javascript
如何使用pm2快速将项目部署到远程服务器
Mar 12 Javascript
Vue实现搜索结果高亮显示关键字
May 28 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
PHP文件操作方法汇总
2015/07/01 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
python检测某个变量是否有定义的方法
2015/05/20 Python
Python实现的弹球小游戏示例
2017/08/01 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
python如何调用百度识图api
2020/09/29 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
新学期开学标语
2014/06/30 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python
tomcat下部署jenkins的方法
2022/05/06 Servers