分享javascript实现的冒泡排序代码并优化


Posted in Javascript onJune 05, 2016

冒泡排序:就是将一个数组中的元素按照从大到小或者从小到大的顺序进行排列。

var array=[9,8,7,6,5,4,3,2,1];

第一轮比较:8,7,6,5,4,3,2,1,9      交换了8次        i=0   j=array.length-1-i

第二轮比较:7,6,5,4,3,2,1,8,9      交换了7次        i=1   j=array.length-1-i

第三轮比较:6,5,4,3,2,1,7,8,9      交换了6次        i=2   j=array.length-1-i

第四轮比较:5,4,3,2,1,6,7,8,9      交换了5次        i=3   j=array.length-1-i

第五轮比较:4,3,2,1,5,6,7,8,9      交换了4次        i=4   j=array.length-1-i

第六轮比较:3,2,1,4,5,6,7,8,9      交换了3次        i=5   j=array.length-1-i

第七轮比较:2,1,3,4,5,6,7,8,9      交换了2次        i=6   j=array.length-1-i

第八轮比较:1,2,3,4,5,6,7,8,9      交换了1次        i=7   j=array.length-1-i

代码实现:

var temp;
var array=[9,8,7,6,5,4,3,2,1];
//外循环控制轮数
for(var i=0;i<array.length-1;i++){
//内循环控制比较次数
  for(var j=0;j<array.length-1-i;j++){
    if(array[j]>array[j+1]){
      //交换两个变量
      temp=array[j];
      array[j]=array[j+1];
      array[j+1]=temp;
    }
  }
}
console.log(array);

代码优化:

var temp,bool,m=0;
var array=[9,8,7,6,5,4,3,2,1];
for(var i=0;i<array.length-1;i++){
  //开闭原则中的开关
  bool = true;
  for(var j=0;j<array.length-1-i;j++){
    if(array[j]>array[j+1]){
      //交换两个变量
      temp=array[j];
      array[j]=array[j+1];
      array[j+1]=temp;
      bool=false;//将开关关闭
    }
  }
  //如果内循环中的if没有被执行(开关关闭,执行下面的语句);
  if(bool){
    break;
  }
  m++;
}
console.log(array+",比较"+m+"轮");

备注:比较轮数最好情况为0轮,最坏为8轮

我们再来看个冒泡排序的算法

//javascript冒泡排序,直接添加到基础类型的原型上
  //这里用一个javascript语言精粹上的 代码,为基础类型原型添加方法,
  // 因为Array,String他们自身也是构造函数,他们创建对象也是通过new 构造函数行的,因此Array.prototype,String.prototype都指向了Function.prototype
  // Array.method的时候,先访问Array自身函数对象没有method方法,接着Array.prototype仍没有,接着Function.prototype找到了
  Function.prototype.method = function (name, func) {
    if(!this.prototype[name]){ 
      //最好先判断一下是原型中否有这个方法,如果没有再添加
      this.prototype[name] = func;
    }
    return this;
  };
  

  Array.method('bubble',function(){
    // 冒泡算法 总共循环数组的长度次,即len次,每次将最小的放最后
    
    var len = this.length;
    var i = 0, 
      j = 0, 
      tmp =0;

    
    for (i=0 ; i < len; i++) {
      for ( j = 0; (j +1) < len-i; j++) {
        console.log()
        if ( this[j] > this[j+1] ){
          tmp = this[j];
          this[j] = this[j+1];
          this[j+1] = tmp;
        }
      };
    };

    return this;
  });

  alert([21,32,1,31,22,45,68,37,].bubble());

看了另一个前端工程师,西风瘦马的代码,在第一层for循环加入初始化一个exchange交换标志为false,当有交换发生时,则变为true,在第二层for循环结束后加入一个判断,如果为false,即从前往后对比没有交换,证明已经大小顺序正确,即可break来跳出外层for循环。

//需要排序的数组
var list = Array(23, 45, 18, 37, 92, 13, 24);
//数组长度
var n = list.length;
//交换顺序的临时变量
var tmp;//
//交换标志
var exchange;
//最多做n-1趟排序
for (var time = 0; time <n - 1; time ++) {
  exchange = false;
  for (var i = n - 1; i> time; i?-) {
    if (list[i] <list[i - 1]) {
      exchange = true;
      tmp = list[i - 1];
      list[i - 1] = list[i];
      list[i] = tmp;
    }
  }
  //若本趟排序未发生交换,提前终止算法
  if (!exchange) {
    break;
  }
}
alert(‘数组排序后为:' + list + ‘,n共排了' + time + ‘趟');

之前还收藏过一个网友的算法,也相当不错,大家看下

function BubbleSort(array) {  
 var length = array.length;  
 var temp; 
 var isSort=false;  
 for(var i = 1; i < length; i++) {  
  isSort = false;  
  
  for(var j = 0; j < length - i; j++) {  
   if(array[j] > array[j+1]) {  
    //交换  
    temp = array[j];  
    array[j] = array[j+1];  
    array[j+1] = temp;      
    isSort = true;  
   }  
  }  
  if(!isSort) break; //如果没有发生交换,则退出循环  
  }  
}
  var array =[10,-3,5,34,-34,5,0,9]; 
  BubbleSort(array);  
  for(var i=0;i< array.length;i++) {  
   document.write(array[i]+ " ");  
  }

好了,今天就先给大家总结这些吧,希望对小伙伴们学习JavaScript冒泡排序能够有所帮助

Javascript 相关文章推荐
jQuery.ajax 用户登录验证代码
Oct 29 Javascript
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
为开发者准备的10款最好的jQuery日历插件
Feb 04 Javascript
如何在node的express中使用socket.io
Dec 15 Javascript
jquery中EasyUI实现异步树
Mar 01 Javascript
JavaScript实现网站访问次数统计代码
Aug 12 Javascript
JavaScript字符串对象
Jan 14 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
浅析Vue中method与computed的区别
Mar 06 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
js实现搜索提示框效果
Sep 05 Javascript
EasyUI布局 高度自适应
Jun 04 #Javascript
javascript获取select标签选中的值
Jun 04 #Javascript
jQuery Mobile 触摸事件实例
Jun 04 #Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 #Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 #Javascript
javacript获取当前屏幕大小
Jun 04 #Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
Jun 03 #Javascript
You might like
PHP内存溢出优化代码详解
2021/02/26 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
浅析javascript 定时器
2014/12/23 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python并发和异步编程实例
2018/11/15 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
Python Collatz序列实现过程解析
2019/10/12 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
win10安装python3.6的常见问题
2020/07/01 Python
Python json格式化打印实现过程解析
2020/07/21 Python
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
《鱼游到了纸上》教学反思
2014/02/20 职场文书
承诺书样本
2014/08/30 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
房屋所有权证明
2015/06/19 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
JS的深浅复制详细
2021/10/16 Javascript
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android