JavaScript实现经典排序算法之冒泡排序


Posted in Javascript onDecember 28, 2016

冒泡排序可谓是最经典的排序算法了,它是基于比较的排序算法,时间复杂度为O(n^2),其优点是实现简单,n较小时性能较好。

1)算法原理
       相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟下来,最小的数就被排在了第一位,第二趟也是如此,如此类推,直到所有的数据排序完成。

2)算法描述
       <1>比较相邻的元素。如果第一个比第二个大,就交换它们两个;
       <2>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
       <3>针对所有的元素重复以上的步骤,除了最后一个;
       <4>重复步骤1~3,直到排序完成。
3)javascript代码实现

function bubbleSort(arr){  
  var len = arr.length;  
  for (var i = 0; i < len; i++) {  
    for(var j = 0; j < len - i -1; j++){  
      if(arr[j]>arr[j+1]){ //相邻元素进行对比  
        var temp = arr[j+1];//交换元素  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
      }  
    }  
  }  
  return arr;//返回数组  
}  
  
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];//调用排序算法  
console.log(bubbleSort(arr));//控制台输出结果

        这个算法是最基本的实现方法,接着进行改进这个算法,通过设置一个标志性的变量position,用于记录每趟排序中最后一次进行交换的位置。因为position位置之后的记录都已经排序好了,所以进行下一趟排序时只需要扫描到position的位置就好。
改进之后的算法如下:

function bubbleSort2(arr){  
  var i = arr.length -1;//开始时,扫描的最后位置  
  while(i>0){  
    var position = 0;//标志性变量,表示当前排序中交换的位置  
    for(var j = 0; j < i; j ++){  
      if(arr[j]>arr[j+1]){  
        position = j;  
        var temp = arr[j+1];  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
      }  
    }  
    i = position;  
  }  
  return arr;  
}  
  
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];  
console.log(bubbleSort2(arr));

      传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
改进之后的算法如下:

function bubbleSort3(arr){  
  var low = 0;  
  var high = arr.length-1;  
  var temp;  
  while(low < high){//找到最大值  
    for(var j = low ; j < high ; j++){  
      if (arr[j]> arr[j+1]) {       
        temp = arr[j+1];  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
       }  
    }  
    --high;//修改high值,向前移一位  
  }  
  while(low > high){//找到最小值  
    for(var j = high ;j > low; j--){  
      if (arr[j]> arr[j+1]) {       
        temp = arr[j+1];  
        arr[j+1] = arr[j];  
        arr[j] = temp;  
       }  
    }  
    ++low;//修改low值,往后移动一位  
  }  
  return arr;  
}  
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];  
console.log(bubbleSort3(arr));

4)算法分析

      最佳情况:T(n) = O(n)
      最差情况:T(n) = O(n2)
      平均情况:T(n) = O(n2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
Jan 09 Javascript
javascript检查表单数据是否改变的方法
Jul 30 Javascript
node.js中使用socket.io的方法
Dec 15 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
May 17 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
jQuery遍历节点方法汇总(推荐)
May 13 jQuery
bootstrap模态框远程示例代码分享
May 22 Javascript
Node.js 的模块知识汇总
Aug 16 Javascript
详解node nvm进行node多版本管理
Oct 21 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
Jun 24 Javascript
BootStrap Tooltip插件源码解析
Dec 27 #Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 #Javascript
javascript实现文字无缝滚动
Dec 27 #Javascript
JavaScript仿聊天室聊天记录
Dec 27 #Javascript
基于jQuery实现顶部导航栏功能
Dec 27 #Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 #Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 #Javascript
You might like
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
详解python多线程之间的同步(一)
2019/04/03 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
python实现按关键字筛选日志文件
2019/12/24 Python
python在地图上画比例的实例详解
2020/11/13 Python
python matlab库简单用法讲解
2020/12/31 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
音乐表演专业毕业生求职信
2013/10/14 职场文书
物流专业大学应届生求职信
2013/11/03 职场文书
临床医学系毕业生推荐信
2013/11/09 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
庆国庆活动总结
2014/08/28 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
作风转变年心得体会
2014/10/22 职场文书
超市员工辞职信范文
2015/05/12 职场文书
立案决定书范文
2015/06/24 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
怎样写工作总结啊!
2019/06/18 职场文书