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编程起步(第四课)
Feb 27 Javascript
js或css实现滚动广告的几种方案
Jan 28 Javascript
用js写了一个类似php的print_r输出换行功能
Feb 18 Javascript
JavaScript如何动态创建table表格
Aug 02 Javascript
微信小程序 石头剪刀布实例代码
Jan 04 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
JS基于贪心算法解决背包问题示例
Nov 27 Javascript
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
layer 关闭指定弹出层的例子
Sep 25 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
May 09 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 Javascript
关于JavaScript数组去重的一些理解汇总
Sep 10 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
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
为你总结一些php信息函数
2015/10/21 PHP
php错误日志简单配置方法
2016/07/11 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
javascript动态加载二
2012/08/22 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python print出共轭复数的方法详解
2019/06/25 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
python 简单的调用有道翻译
2020/11/25 Python
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
三年级科学教学反思
2014/01/29 职场文书
英文道歉信
2015/01/20 职场文书
考试作弊检讨
2015/01/27 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
创业计划书之养殖业
2019/10/11 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
如何用Navicat操作MySQL
2021/05/12 MySQL
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python