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 相关文章推荐
一个js写的日历(代码部分网摘)
Sep 20 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
Apr 20 Javascript
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
使用jquery提交form表单并自定义action的方法
May 25 Javascript
javascript中的深复制详解及实例分析
Dec 29 Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 Javascript
关于Vue在ie10下空白页的debug小结
May 02 Javascript
webpack4 + react 搭建多页面应用示例
Aug 03 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 Javascript
Js通过AES加密后PHP用Openssl解密的方法
Jul 12 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 Javascript
详解element-ui动态限定的日期范围选择器代码片段
Jul 03 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验证码的实现原理 附php验证码小案例
2016/08/17 PHP
用jscript实现新建word文档
2007/06/15 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
Python绘制七段数码管实例代码
2017/12/20 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
.net C#面试题
2012/08/28 面试题
财务经理的岗位职责
2013/12/17 职场文书
清明节演讲稿
2014/05/27 职场文书
四风对照检查材料范文
2014/09/27 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
同学聚会祝酒词
2015/08/10 职场文书