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动态生成指定行数的表格
Jul 11 Javascript
js捕获鼠标滚轮事件代码
Dec 16 Javascript
jQuery操作DOM之获取表单控件的值
Jan 23 Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
Dec 23 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 Javascript
微信小程序 wx.request(object) API详解及实例代码
Sep 30 Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
React Hooks的深入理解与使用
Nov 12 Javascript
jQuery无冲突模式详解
Jan 17 jQuery
element实现合并单元格通用方法
Nov 13 Javascript
vue-router 路由传参用法实例分析
Mar 06 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读取msn上的用户信息类
2008/12/05 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
python字典排序实例详解
2015/05/20 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
法学专业个人求职信
2013/09/26 职场文书
文秘专业毕业生就业推荐信
2013/11/08 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python