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 相关文章推荐
eval与window.eval的差别分析
Mar 17 Javascript
JavaScript将数字转换成大写中文的方法
Mar 23 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
Feb 19 Javascript
js自定义select下拉框美化特效
May 12 Javascript
JavaScript实现简单的拖动效果
Jul 02 Javascript
d3.js中冷门却实用的内置函数总结
Feb 04 Javascript
js实现抽奖效果
Mar 27 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
bootstrap treeview 树形菜单带复选框及级联选择功能
Jun 08 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 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
资料注册后发信小技巧
2006/10/09 PHP
php调整服务器时间的方法
2015/04/03 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中unittest用法实例
2014/09/25 Python
用实例分析Python中method的参数传递过程
2015/04/02 Python
查看Django和flask版本的方法
2018/05/14 Python
python计算两个数的百分比方法
2018/06/29 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
财务会计大学生自我评价
2014/04/09 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
2014年优秀党员材料
2014/12/18 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python