分享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 相关文章推荐
JScript中的&quot;this&quot;关键字使用方式补充材料
Mar 08 Javascript
extjs之去除s.gif的影响
Dec 25 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
Nov 18 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
jQuery序列化后的表单值转换成Json
Jun 16 jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 Javascript
angularjs select 赋值 ng-options配置方法
Feb 28 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
微信小程序实现文字从右向左无限滚动
Nov 18 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 Javascript
Javascript实现秒表计时游戏
May 27 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
PHP4之真OO
2006/10/09 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
js 深拷贝函数
2008/12/04 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
python实现连接mongodb的方法
2015/05/08 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
Django 反向生成url实例详解
2019/07/30 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
2014年教研工作总结
2014/12/06 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android