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 相关文章推荐
变量声明时命名与变量作为对象属性时命名的区别解析
Dec 06 Javascript
详解js闭包
Sep 02 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
Sep 20 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
浅谈JavaScript的全局变量与局部变量
Jun 10 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
Jan 20 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
Apr 06 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
Oct 09 jQuery
JavaScript实现音乐自动切换和轮播
Nov 05 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
vue单页开发父子组件传值思路详解
May 18 Javascript
前端实现滑动按钮AJAX与后端交互的示例代码
Feb 24 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
Search Engine Friendly的URL设计
2006/10/09 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
vue实现修改图片后实时更新
2019/11/14 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Django中使用Celery的方法步骤
2020/12/07 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
高中自我鉴定范文
2013/11/03 职场文书
工作失职检讨书范文
2014/01/16 职场文书
函授本科自我鉴定
2014/02/04 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
销售员岗位职责
2015/02/10 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
instantclient客户端 连接oracle数据库
2022/04/26 Oracle