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 相关文章推荐
js实现拉伸拖动iframe的具体代码
Aug 03 Javascript
ExtJs中gridpanel分组后组名排序实例代码
Dec 02 Javascript
js的Boolean对象初始值示例
Mar 04 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
JavaScript中实现sprintf、printf函数
Jan 27 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
BootStrap table使用方法分析
Nov 08 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
JQuery选中select组件被选中的值方法
Mar 08 jQuery
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
Nov 07 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实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
php二维码生成
2015/10/19 PHP
PHP查询分页的实现代码
2017/06/09 PHP
JQuery弹出层示例可自定义
2014/05/19 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python使用xpath实现图片爬取
2020/09/16 Python
python的dict判断key是否存在的方法
2020/12/09 Python
python Pexpect模块的使用
2020/12/25 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
征用土地赔偿协议书
2014/09/26 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
Python源码解析之List
2021/05/21 Python
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
python中__slots__节约内存的具体做法
2021/07/04 Python