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 相关文章推荐
Firebug入门指南(Firefox浏览器)
Aug 21 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
Dec 08 Javascript
JQuery之拖拽插件实现代码
Apr 14 Javascript
JQuery遍历json数组的3种方法
Nov 08 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
Aug 11 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
每天一篇javascript学习小结(Boolean对象)
Nov 12 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
Jun 15 Javascript
element-ui表格列金额显示两位小数的方法
Aug 24 Javascript
vue3 自定义图片放大器效果的示例代码
Jul 23 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
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
php中adodbzip类实例
2014/12/08 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
Django 前后台的数据传递的方法
2017/08/08 Python
超简单的Python HTTP服务
2019/07/22 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
优秀学生获奖感言
2014/02/15 职场文书
计算机专业求职信
2014/06/02 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
自我检讨书范文
2015/01/28 职场文书
民事起诉书范本
2015/05/19 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
PyMongo 查询数据的实现
2021/06/28 Python
python前后端自定义分页器
2022/04/13 Python