分享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 相关文章推荐
javascript与CSS复习(三)
Jun 29 Javascript
DOM 中的事件处理介绍
Jan 18 Javascript
jQuery中校验时间格式的正则表达式小结
Sep 22 Javascript
JS中的构造函数详细解析
Mar 10 Javascript
JS学习之表格的排序简单实例
May 16 Javascript
浅谈JS中逗号运算符的用法
Jun 12 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
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实现的MySQL通用查询程序
2007/03/11 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
深入apache host的配置详解
2013/06/09 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
python实现文本界面网络聊天室
2018/12/12 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
python实现数据分析与建模
2019/07/11 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
会计学应届毕业生推荐信
2013/11/04 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
报关专员求职信范文
2014/02/22 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
作弊检讨书范文
2015/05/06 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
python 实现图片特效处理
2022/04/03 Python