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 相关文章推荐
兼容FireFox 的 js 日历 支持时间的获取
Mar 04 Javascript
input 输入框内的输入事件详细分析
Mar 17 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
javascript实现颜色渐变的方法
Oct 30 Javascript
JavaScript中对象属性的添加和删除示例
May 12 Javascript
jQuery内置的AJAX功能和JSON的使用实例
Jul 27 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
Dec 13 Javascript
使用jquery获取url及url参数的简单实例
Jun 14 Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 Javascript
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
JavaScript变量提升和严格模式实例分析
Jan 27 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实现一个简单的用户登记表示例
2017/04/25 PHP
php格式文件打开的四种方法
2018/02/24 PHP
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
vue实现放大镜效果
2020/09/17 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
Python操作MySQL数据库9个实用实例
2015/12/11 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Django REST framework 分页的实现代码
2019/06/19 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
Python解析json代码实例解析
2019/11/25 Python
Python中base64与xml取值结合问题
2019/12/22 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
小学生迎国庆演讲稿
2014/09/05 职场文书
运动会报道稿300字
2014/10/02 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
企业战略合作意向书
2015/05/08 职场文书
亲戚关系证明
2015/06/24 职场文书