zoukankan      html  css  js  c++  java
  • Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)

    冒泡排序的Javascript实现

    首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组,

     1 function bubbleSort(arr) {
     2         console.time('冒泡排序耗时');
     3         var len = arr.length,temp;
     4         for(var i=0;i<len;i++){
     5             for(j=0;j<len-i-1;j++){
     6                     if(arr[j]>arr[j+1]){
     7                            temp = arr[j+1];
     8                            arr[j+1] = arr[j];
     9                            arr[j] = temp;
    10                     }
    11             }
    12         }
    13         console.timeEnd('冒泡排序耗时');
    14         return arr;
    15 }
    16 
    17 
    18 var array = [];
    19 
    20 for(var i=0;i<100000;i++){
    21      var x = Math.random()*100000;
    22      var y = Math.floor(x);
    23      array.push(y);
    24 }
    25 
    26 console.log(bubbleSort(array));     
    27 //冒泡排序十次平均耗时: 37019.239013671875ms    

    下面我们来看一下在javascript中的array原型链上的sort()方法的特点

    1 function Sort(arr) {
    2       console.time('排序耗时');
    3       var arr1= arr.sort(function(a,b){return a-b});
    4       console.timeEnd('排序耗时');
    5       return arr1;
    6       
    7 }
    8 
    9 Sort(array);                //排序十次平均耗时: 79.05419921875ms       

    由上面的代码可以知道,javasrcipt中array原型链上的sort方法的效率是很高的

    //冒泡排序的改良方法(一)

    function bubbleSort1(arr) {
      console.time('改进后冒泡排序耗时一');
      var i = arr.length-1,tmp; //初始时,最后位置保持不变  
      while ( i> 0) {
        var pos= 0; //每趟开始时,无记录交换
        for (var j= 0; j< i; j++){
          if (arr[j]> arr[j+1]) {
             pos= j; //记录交换的位置
             tmp = arr[j]; 
                               arr[j]=arr[j+1];
                               arr[j+1]=tmp;
          }
        }
        i= pos; //为下一趟排序作准备
      }
      console.timeEnd('改进后冒泡排序耗时一');
      return arr;
    }
    
    console.log(bubbleSort1(array));             
        //           改进后冒泡排序十次平均耗时: 30493.7470703125ms      

    //冒泡排序的改良方法(二)

     1 function bubbleSort2(arr) {
     2   var low = 0;
     3   var high= arr.length-1; //设置变量的初始值
     4   var tmp,j;
     5   console.time('改进后冒泡排序耗时二');
     6   while (low < high) {
     7     for (j= low; j< high; ++j) {         //正向冒泡,找到最大者
     8       if (arr[j]> arr[j+1]) {
     9         tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;
    10       }
    11     }
    12     --high;  //修改high值, 前移一位
    13     for (j=high; j>low; --j) {          //反向冒泡,找到最小者
    14       if (arr[j]<arr[j-1]) {
    15         tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;
    16       }
    17     } 
    18     ++low;  //修改low值,后移一位
    19   }
    20   console.timeEnd('改进后冒泡排序耗时二');
    21   return arr;
    22 }
    23 
    24 console.log(bubbleSort2(array));
    // 改进后冒泡排序十次平均耗时: 23629.715087890625ms

    //冒泡排序的改良方法(三)

     1 function bubbleSort3(arr) {
     2   var low = 0;
     3   var high= arr.length-1; //设置变量的初始值
     4   var tmp,j;
     5   console.time('改进后冒泡排序耗时三');
     6   while (low < high) {
     7     var pos1 = 0,pos2=0; 
     8     for (let i= low; i< high; ++i) { //正向冒泡,找到最大者
     9       if (arr[i]> arr[i+1]) {
    10         tmp = arr[i]; arr[i]=arr[i+1];arr[i+1]=tmp;
    11         pos1 = i ;
    12       }
    13     }
    14 
    15     high = pos1;// 记录上次位置
    16 
    17     for (let j=high; j>low; --j) { //反向冒泡,找到最小者
    18       if (arr[j]<arr[j-1]) {
    19         tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;  
    20         pos2 = j;
    21       }
    22     }   
    23     
    24     low = pos2; //修改low值
    25   }
    26   console.timeEnd('改进后冒泡排序耗时三');
    27   return arr;
    28 }
    29 
    30 console.log(bubbleSort3(array));              
    31 // 改进后冒泡排序十次平均耗时:  20408.427734375ms

    由上面的运行结果可知,冒泡排序虽然是比较常用的排序方法,但其实其执行效率是比较低的

    冒泡排序的平均时间维度为: O(n*n)    最好的情况 O(n)  最差的情况  : O(n*n)      空间复杂度 O(1)  排序方式: in-place    稳定性:稳定

    图片名词解释:
    n: 数据规模
    k:“桶”的个数
    In-place: 占用常数内存,不占用额外内存
    Out-place: 占用额外内存

    稳定:即如果两个数相等,那么位置不会交换

    不稳定:如果两个数相等,那么也有可能交换位置

  • 相关阅读:
    MyEclipse中代码提醒功能
    oracle12c创建用户等问题
    java中的构造块、静态块等说明
    jquery中的get和post、ajax有关返回值的问题描述
    最大半连通子图 BZOJ 1093
    最小生成树计数 BZOJ 1016
    水平可见直线 BZOJ 1007
    分金币 BZOJ 3293
    游走 BZOJ 3143
    糖果 BZOJ 2330
  • 原文地址:https://www.cnblogs.com/liquanjiang/p/8711858.html
Copyright © 2011-2022 走看看