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 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
Window.Open打开窗体和if嵌套代码
Apr 15 Javascript
原生js实现jquery函数animate()动画效果的简单实例
Aug 21 Javascript
Js实现中国公民身份证号码有效性验证实例代码
May 03 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 Javascript
微信、QQ、微博、Safari中使用js唤起App
Jan 24 Javascript
了解JavaScript表单操作和表单域
May 27 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
angular组件间传值测试的方法详解
May 07 Javascript
Vue详细的入门笔记
May 10 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 $_ENV为空的原因分析
2009/06/01 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python全局变量操作详解
2015/04/14 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
python中关于for循环的碎碎念
2017/06/30 Python
Django入门使用示例
2017/12/12 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Python 使用多属性来进行排序
2019/09/01 Python
Python3如何判断三角形的类型
2020/04/12 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
世界经理人咨询有限公司面试
2014/09/23 面试题
超市采购员岗位职责
2014/02/01 职场文书
司马光教学反思
2014/02/01 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
计生工作先进事迹
2014/08/15 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
2015年环保局工作总结
2015/05/22 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
优秀员工演讲稿
2019/06/21 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
mysql如何配置白名单访问
2021/06/30 MySQL
React Fragment介绍与使用详解
2021/11/11 Javascript
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技