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 Jcrop插件实现图片选取功能
Nov 23 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 25 Javascript
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
Node.js中的事件驱动编程详解
Aug 16 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
Feb 04 Javascript
判断输入的字符串是否是日期格式的简单方法
Jul 11 Javascript
D3.js实现折线图的方法详解
Sep 21 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
Nov 01 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
Mar 04 Javascript
详解vuex状态管理模式
Nov 01 Javascript
jQuery+ajax实现文件上传功能
Dec 22 jQuery
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判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
js 调整select 位置的函数
2008/02/21 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
javascript基本算法汇总
2016/03/09 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
pip命令无法使用的解决方法
2018/06/12 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
python自动化办公操作PPT的实现
2021/02/05 Python
求职者简历中的自我评价
2013/10/20 职场文书
公证委托书模板
2014/04/03 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL
PHP 时间处理类Carbon
2022/05/20 PHP