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 相关文章推荐
jquery validation插件表单验证的一个例子
Mar 03 Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
Mar 16 Javascript
JS实现图片翻书效果示例代码
Sep 09 Javascript
探讨JavaScript中声明全局变量三种方式的异同
Dec 03 Javascript
让angularjs支持浏览器自动填表
Nov 10 Javascript
JS简单实现动画弹出层效果
May 05 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
jQuery实现的form转json经典示例
Oct 10 jQuery
实现elementUI表单的全局验证的方法步骤
Apr 29 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 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的error_reporting错误级别变量对照表
2014/07/08 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
刘胡兰的英雄事迹材料
2014/02/11 职场文书
双语教学实施方案
2014/03/23 职场文书
设计师求职信
2014/07/01 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
见义勇为事迹材料
2014/12/24 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
Python经常使用的一些内置函数
2022/04/11 Python