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 相关文章推荐
Use Word to Search for Files
Jun 15 Javascript
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
Aug 31 Javascript
js如何获取兄弟、父类等节点
Jan 06 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
Bootstrap CSS布局之列表
Dec 15 Javascript
JS实现的系统调色板完整实例
Dec 21 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
Oct 22 Javascript
antd table按表格里的日期去排序操作
Nov 17 Javascript
json.stringify()与json.parse()的区别以及用处
Jan 25 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 strtr() 函数使用说明
2008/11/21 PHP
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
python执行外部程序的常用方法小结
2015/03/21 Python
python感知机实现代码
2019/01/18 Python
Python判断有效的数独算法示例
2019/02/23 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
招商经理岗位职责
2013/11/16 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
新品发布会策划方案
2014/06/08 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
学校通报表扬范文
2015/05/04 职场文书
学校社团活动总结
2015/05/07 职场文书
Python3 类型标注支持操作
2021/06/02 Python
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android