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不能获取隐藏的div的宽度只能先显示后获取
Sep 04 Javascript
jQuery实现新消息闪烁标题提示的方法
Mar 11 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
动态加载js、css的简单实现代码
May 26 Javascript
jQuery使用经验小技巧(推荐)
May 31 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
使用Vue完成一个简单的todolist的方法
Dec 01 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
浅谈关于vue中scss公用的解决方案
Dec 02 Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
session 的生命周期是多长
2006/10/09 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
实例讲解Python中函数的调用与定义
2016/03/14 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
详解python UDP 编程
2020/08/24 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
采购文员岗位职责
2013/11/20 职场文书
单位领导证婚词
2014/01/14 职场文书
入党介绍人评语
2014/05/06 职场文书
征兵宣传标语
2014/06/20 职场文书
二人合伙经营协议书
2014/09/13 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书