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

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

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冒泡排序能够有所帮助

(0)

相关推荐

  • js交换排序 冒泡排序算法(Javascript版)

    比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. function sort(elements){ for(var i=0;i<elements.length-1;i++){ for(var j=0;j<elements.length-i-1;j++){ if(elemen

  • JS实现冒泡排序,插入排序和快速排序并排序输出

    在一次面试中被问到了此问题,但是真是懵了,没能回答上来,后来通过JS整理了一下,在结合html代码做了一个文本框,把输入的内容从文本框排序输出,再次不做叙述了,下面通过一段代码给大家展示下: 以下是代码: index.html <!DOCTYPE html> <html> <head> <title>Sorting</title> <link rel="stylesheet" type="text/css&qu

  • Javascript冒泡排序算法详解

    比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 复制代码 代码如下: function sort(elements){   for(var i=0;i<elements.length-1;i++){     for(var j=0;j<elements.length-i-

  • javascript中数组的冒泡排序使用示例

    复制代码 代码如下: <html> <head> <title>数组的排序</title> <script> var arr = [2,4,9,11,6,3,88]; //采用冒泡排序,向上冒泡,最小值在最上边 for(var x = 0 ; x < arr.length; x++){//控制趟数 for(var y = x + 1 ; y < arr.length ; y++){ //依次比较,如果后面的元素大于前面的元素则交换 i

  • js实现数组冒泡排序、快速排序原理

    本文为大家分享了js数组冒泡排序.快速排序的实现原理,供大家参考,具体内容如下 1.冒泡排序: 随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果. var arr = [3,1,4,2,5,21,6,15,63]; function sortA(arr){ for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j+

  • JavaScript 冒泡排序和选择排序的实现代码

    废话不多说了,直接给大家贴代码了,具体代码如下所述: var array = [1,2,3,4,5]; // ---> 服务 //效率 ---> 针对一个有序的数组 效率最高 //标志 true false for(var j = 0; j < array.length - 1;j++ ){ //- j 每次排序完成之后 后面减少比较的次数 var isTrue = true; //如果数组本身就是升序,则直接输出 for(var i = 0; i < array.length -

  • javascript 冒泡排序 正序和倒序实现代码

    复制代码 代码如下: <script type="text/javascript"> var R1=[5,2,10,4,90,88,65,62]; var R2=[5,2,10,4,90,88,65,62]; function BubbleSort1(){ var n=R1.length; for(var i=0;i<n-1;i++){ var flag=false; for(var j=0;j<n-i;j++){ var temp; if(R1[j]<R

  • JS排序之冒泡排序详解

    本文为大家分享了JS冒泡排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置 --JS冒泡排序-- 原理 依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面.依照这个规则进行多次并且递减的迭代,直到顺序正确. 时间复杂度,空间复杂度,稳定性 平均时间复杂度O(n*n) 最好情况O(n) 最差

  • js 排序动画模拟 冒泡排序

    而在某些场景中,队列确实像一支奇兵,可以带来不错的效果,比如配合定时器使用,可以模拟时间差效果 复制代码 代码如下: function createDq(){ var dq = [], size = 0; return { setDq:function(queue){ dq = queue; size = queue.length; }, queue:function(fn){ size ++; dq.push(fn); }, dqueue:function(){ size --; return

  • JavaScript中的冒泡排序法

    利用sort()冒泡排序: var arr = [5,39,8,1,2,13,55]; arr = arr.sort(function(a,b){return a-b}); console.log(arr);//1,2,5,8,13,39,55 不声明第三个变量冒泡排序: 第一层遍历数组的个数(要遍历多少次),第二次遍历(共要循环几次) a = 10; //第一个元素 b = 5; //下一个元素 if(a>b){ a = a+b; // a(15) = 10 +5; b = a-b; // b

随机推荐