分享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使用手册之 事件处理
Mar 24 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
JS去除字符串两端空格的简单实例
Dec 27 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
Node.js利用debug模块打印出调试日志的方法
Apr 25 Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
Nov 12 Javascript
通过Kettle自定义jar包供javascript使用
Jan 29 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 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 无限级 SelectTree 类
2009/05/19 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Python创建文件和追加文件内容实例
2014/10/21 Python
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
python解决字符串倒序输出的问题
2018/06/25 Python
创建Django项目图文实例详解
2019/06/06 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
Python with标签使用方法解析
2020/01/17 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
商场促销活动策划方案
2014/08/18 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
工作自我评价范文
2019/03/21 职场文书