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 相关文章推荐
window.location.hash 使用说明
Nov 08 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
Dec 25 Javascript
window.showModalDialog()返回值的学习心得总结
Jan 07 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
JavaScript参数个数可变的函数举例说明
Oct 10 Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
Mar 04 Javascript
vue 使用async写数字动态加载效果案例
Jul 18 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
Sep 02 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扩展模块memcached长连接使用方法分析
2014/12/24 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
Vue与React的区别和优势对比
2020/12/18 Vue.js
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
大专毕业生自我鉴定
2013/11/21 职场文书
出纳担保书范文
2014/04/02 职场文书
医师定期考核实施方案
2014/05/07 职场文书
如何写股份合作协议书
2014/09/11 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
详解python网络进程
2021/06/15 Python
Opencv中cv2.floodFill算法的使用
2021/06/18 Python
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript