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 相关文章推荐
javascript Zifa FormValid 0.1表单验证 代码打包下载
Jun 08 Javascript
js中各种类型的变量在if条件中是true还是false
Jul 16 Javascript
JavaScript动态设置div的样式的方法
Dec 26 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
微信小程序 监听手势滑动切换页面实例详解
Jun 15 Javascript
解决vue里碰到 $refs 的问题的方法
Jul 13 Javascript
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 Javascript
基于layPage插件实现两种分页方式浅析
Jul 27 Javascript
vue使用微信扫一扫功能的实现代码
Apr 11 Javascript
JS算法教程之字符串去重与字符串反转
Dec 15 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采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
非常实用的php验证码类
2016/05/15 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
详解JavaScript的变量
2019/04/04 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
python面向对象 反射原理解析
2019/08/12 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
在vscode中配置python环境过程解析
2019/09/28 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
企业爱岗敬业演讲稿
2014/09/04 职场文书
手术室护士个人总结
2015/02/13 职场文书
2015年电教工作总结
2015/05/26 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
MySQL创建管理KEY分区
2022/04/13 MySQL
Python实现数据的序列化操作详解
2022/07/07 Python