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 相关文章推荐
javascript 主动派发事件总结
Aug 09 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
Jul 09 Javascript
jquery事件重复绑定的快速解决方法
Jan 03 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
Aug 27 Javascript
vue.js利用Object.defineProperty实现双向绑定
Mar 09 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
JS与HTML结合实现流程进度展示条思路详解
Sep 03 Javascript
JS中offset和匀速动画详解
Feb 06 Javascript
vue自动化表单实例分析
May 06 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 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简单日历实现方法
2016/07/20 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
不安全的常用的js写法
2009/09/15 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
高效使用Python字典的清单
2018/04/04 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
购房意向书
2014/04/01 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
先进个人材料怎么写
2014/12/30 职场文书
考试作弊检讨
2015/01/27 职场文书
单位介绍信格式
2015/01/31 职场文书
2015年环保局工作总结
2015/05/22 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
小程序自定义轮播图圆点组件
2022/06/25 Javascript