Javascript快速排序算法详解


Posted in Javascript onDecember 03, 2014

快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终达到整个数据变成有序序列。

假设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为基准数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量low、high,排序开始的时候:low=0,high=N-1;
2)以第一个数组元素作为基准数据,赋值给base,即base=A[0];
3)从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于base的值A[high],将A[high]和A[low]互换;
4)从low开始向后搜索,即由前开始向后搜索(low++),找到第一个大于base的A[low],将A[low]和A[high]互换;
5)重复第3、4步,直到low=high;

function partition(elements, low, high){

  //默认将左侧首元素作为基准元素

  var base=elements[low];

  while(low < high){

    //从后往前搜索,直到找到比基准元素小的元素,并进行交换

    while(low < high && elements[high] >= base) high--;

    var swap1=elements[low];elements[low]=elements[high];elements[high]=swap1;

    //从前往后搜索,直到找到比基准元素大的元素,并进行交换

    while(low < high && elements[low] <= base) low++;

    var swap2=elements[low];elements[low]=elements[high];elements[high]=swap2;

  }

  //返回基准元素的位置,作为序列的分割位置

  return low;

}

function sort(elements, low, high){

  if(low<high){

    //将序列一分为二,分为分割位置的前后序列,前序列比分割位置的值小,后序列比分割位置的值大

    var partitionPos=partition(elements, low, high);

    //对前序列继续递归排序

    sort(elements, 0, partitionPos-1);

    //对后序列继续递归排序

    sort(elements, partitionPos+1, high);

  }

}

var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];

console.log('before: ' + elements);

sort(elements, 0, elements.length-1);

console.log(' after: ' + elements);

效率:

时间复杂度:最好:O(nlog2n),最坏:O(n^2),平均:O(nlog2n)。

空间复杂度:O(nlog2n)。

稳定性:不稳定。

Javascript 相关文章推荐
Jquery拖拽并简单保存的实现代码
Nov 28 Javascript
node.js中的console.dir方法使用说明
Dec 10 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
Mar 31 Javascript
完美实现bootstrap分页查询
Dec 09 Javascript
如何消除inline-block属性带来的标签间间隙
Mar 31 Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 Javascript
浅谈JS之iframe中的窗口
Sep 13 Javascript
AngularJS指令用法详解
Nov 02 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
Sep 21 jQuery
JavaScript实现的简单Tab点击切换功能示例
Jul 06 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
May 29 Javascript
JavaScript实现简单动态表格
Dec 02 Javascript
Javascript冒泡排序算法详解
Dec 03 #Javascript
Javascript堆排序算法详解
Dec 03 #Javascript
node.js下when.js 的异步编程实践
Dec 03 #Javascript
jquery操作 iframe的方法
Dec 03 #Javascript
使用js实现数据格式化
Dec 03 #Javascript
使用js获取图片原始尺寸
Dec 03 #Javascript
上传文件返回的json数据会被提示下载问题解决方案
Dec 03 #Javascript
You might like
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
[03:08]Ti4观战指南上
2014/07/07 DOTA
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
Python3内置模块random随机方法小结
2019/07/13 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
剪枝的学问教学反思
2014/02/07 职场文书
社会实践活动总结报告
2014/04/29 职场文书
博士生求职信
2014/07/06 职场文书
企业消防安全责任书
2014/07/23 职场文书
关于读书的活动方案
2014/08/14 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
钳工实训报告总结
2014/11/04 职场文书
人事聘任通知
2015/04/21 职场文书
化工厂员工工作总结
2015/10/15 职场文书
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技