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 相关文章推荐
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
Jun 26 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
Jan 31 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
Mar 07 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
Apr 18 Javascript
微信小程序商城项目之商品属性分类(4)
Apr 17 Javascript
Javascript防止图片拉伸的自适应处理方法
Dec 26 Javascript
浅析vue.js数组的变异方法
Jun 30 Javascript
Angularjs中的$apply及优化使用详解
Jul 02 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
JavaScript实现alert弹框效果
Nov 19 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
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
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
python访问sqlserver示例
2014/02/10 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
python实现AES加密和解密
2019/03/27 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
Android笔试题总结
2014/11/29 面试题
单位创先争优活动方案
2014/01/26 职场文书
幼儿园教师节活动方案
2014/02/02 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
孔繁森观后感
2015/06/10 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书