分享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 相关文章推荐
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
jQuery中delegate和on的用法与区别详细解析
Jan 26 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
May 27 Javascript
javascript继承的六大模式小结
Apr 13 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
jQuery加密密码到cookie的实现代码
Apr 18 jQuery
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
VUE前后端学习tab写法实例
Aug 06 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
Dec 24 Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 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中将网址转换为超链接的函数
2011/09/02 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
php使用session二维数组实例
2014/11/06 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
JS 有名函数表达式全面解析
2010/03/19 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
javascript常用的方法整理
2015/08/20 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
Django框架models使用group by详解
2020/03/11 Python
django配置app中的静态文件步骤
2020/03/27 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
详解如何修改python中字典的键和值
2020/09/29 Python
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
外国人聘用意向书
2014/04/01 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
作风年建设汇报材料
2014/08/14 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
python基础入门之字典和集合
2021/06/13 Python