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 相关文章推荐
JavaScript 序列化对象实现代码
Dec 18 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
Jan 11 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
May 31 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
js实现适配不同的屏幕大小
Apr 10 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 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 str_pad 函数用法简介
2009/07/11 PHP
php array_search() 函数使用
2010/04/13 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
PHP实现简易blog的制作
2016/10/24 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
js实现旋转木马效果
2017/03/17 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
Python字符串及文本模式方法详解
2020/09/10 Python
祖国在我心中演讲稿300字
2014/05/04 职场文书
广播体操口号
2014/06/18 职场文书
保密工作整改报告
2014/11/06 职场文书
人事任命通知书
2015/04/21 职场文书
公积金贷款承诺书
2015/04/30 职场文书
放牛班的春天观后感
2015/06/01 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
Python实现双向链表基本操作
2022/05/25 Python