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分页效果示例
Oct 11 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
Dec 23 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
JS简单操作select和dropdownlist实例
Nov 26 Javascript
js实现禁止中文输入的方法
Jan 14 Javascript
JavaScript实现经典排序算法之插入排序
Dec 28 Javascript
bootstrap Table插件使用demo
Aug 07 Javascript
vuejs父子组件之间数据交互详解
Aug 09 Javascript
使用Bootrap和Vue实现仿百度搜索功能
Oct 26 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
vue 页面跳转的实现方式
Jan 12 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
JS获取父节点方法
2009/08/20 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
英国电子专家:maplin
2019/09/04 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
新闻专业应届生求职信
2013/10/31 职场文书
课程设计心得体会
2013/12/28 职场文书
八年级物理教学反思
2014/01/19 职场文书
小学生家长评语大全
2014/02/10 职场文书
军训感想500字
2014/02/20 职场文书
教学评估实施方案
2014/03/16 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
运动会通讯稿50字
2015/07/20 职场文书
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers
Vue router配置与使用分析讲解
2022/12/24 Vue.js