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 读书笔记索引贴
Jan 11 Javascript
网易JS面试题与Javascript词法作用域说明
Nov 09 Javascript
通过一段代码简单说js中的this的使用
Jul 23 Javascript
jQuery的css()方法用法实例
Dec 24 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
javascript实现动态导入js与css等静态资源文件的方法
Jul 25 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
Oct 08 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
Mar 12 Javascript
Vue.js 无限滚动列表性能优化方案
Dec 02 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下拉选项的批量操作的实现代码
2013/10/14 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
详解React中的组件通信问题
2017/07/31 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
Python实现手绘图效果实例分享
2020/07/22 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
举例说明类变量和实例变量的区别
2016/06/30 面试题
农民工工资支付承诺函
2014/03/31 职场文书
文明寝室申报材料
2014/05/12 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android