• js中各个排序算法和sort函数的比较


    js中要实现数据排序,其实只需要用sort函数就能很好的满足了,但是我今天想知道他和其他排序算法的区别,比如耗时呀等。测了一组数据如下:

      1 // ---------- 一些排序算法
      2 Sort = {}
      3 Sort.prototype = {
      4       // 利用sort进行排序  
      5        systemSort:function(array){  
      6           return array.sort(function(a, b){  
      7               return a - b;  
      8           });  
      9       },  
     11       // 冒泡排序  
     12       bubbleSort:function(array){  
     13           var i = 0, len = array.length,  
     14               j, d;  
     15           for(; i<len; i++){  
     16               for(j=0; j<len; j++){  
     17                   if(array[i] < array[j]){  
     18                       d = array[j];  
     19                       array[j] = array[i];  
     20                       array[i] = d;  
     21                   }  
     22               }  
     23           }  
     24           return array;  
     25       }, 
     27       // 快速排序  
     28       quickSort:function(array){  
     29           //var array = [8,4,6,2,7,9,3,5,74,5];  
     30           //var array =[0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];  
     31           var i = 0;  
     32           var j = array.length - 1;  
     33           var Sort = function(i, j){  
     34               // 结束条件  
     35               if(i == j ){ return };
     36               var key = array[i];  
     37               var tempi = i; // 记录开始位置  
     38               var tempj = j; // 记录结束位置  
     39               
     40               while(j > i){  
     41                   // j <<-------------- 向前查找  
     42                   if(array[j] >= key){  
     43                       j--;  
     44                   }else{  
     45                       array[i] = array[j]  
     46                       //i++ ------------>>向后查找  
     47                       while(j > ++i){  
     48                           if(array[i] > key){  
     49                               array[j] = array[i];  
     50                               break;  
     51                           }  
     52                       }  
     53                   }  
     54               }
     55               // 如果第一个取出的 key 是最小的数  
     56               if(tempi == i){  
     57                   Sort(++i, tempj);  
     58                   return ;  
     59               }
     60               // 最后一个空位留给 key  
     61               array[i] = key;  
     62               // 递归  
     63               Sort(tempi, i);  
     64               Sort(j, tempj);
     65           }  
     66           Sort(i, j);
     67           return array;  
     68       },    
     70       // 插入排序  
     71       insertSort:function(array){  
     72           // http://baike.baidu.com/image/d57e99942da24e5dd21b7080  
     73           // http://baike.baidu.com/view/396887.htm  
     74           // var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];  
     75           var i = 1, j, temp, key, len = array.length;
     76           for(; i < len; i++){  
     77               temp = j = i;  
     78               key = array[j];  
     79               while(--j > -1){  
     80                   if(array[j] > key){  
     81                       array[j+1] = array[j];  
     82                   }else{
     83                       break;
     84                   }
     85               }
     86               array[j+1] = key;  
     87           }
     88           return array;  
     89       },  
     90         
     91       // 希尔排序  
     92       //Jun.array.shellSort(Jun.array.df(10000));  
     93       shellSort:function(array){  
     94           // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F  
     95           // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
     96           // var tempArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];   
     97           // reverse() 在维基上看到这个最优的步长 较小数组  
     98           var tempArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]  
     99               //针对大数组的步长选择  
    100           var i = 0;  
    101           var tempArrLength = tempArr.length;  
    102           var len = array.length;  
    103           var len2 =  parseInt(len/2);  
    104             
    105           for(;i < tempArrLength; i++){  
    106               if(tempArr[i] > len2){  
    107                   continue;  
    108               }
    109               tempSort(tempArr[i]);  
    110           }
    111           // 排序一个步长  
    112           function tempSort(temp){  
    113               //console.log(temp) 使用的步长统计  
    114               var i = 0, j = 0, f, tem, key;  
    115               var tempLen = len%temp > 0 ?  parseInt(len/temp) + 1 : len/temp;          
    117               for(;i < temp; i++){// 依次循环列  
    119                   for(j=1;/*j < tempLen && */temp * j + i < len; j++){
    120                         //依次循环每列的每行  
    121                       tem = f = temp * j + i;  
    122                       key = array[f];     
    124                       while((tem-=temp) >= 0){  
    125                             // 依次向上查找
    126                           if(array[tem] > key){
    127                               array[tem+temp] = array[tem];
    128                           }else{
    129                               break;
    130                           }
    131                       }
    132                       array[tem + temp ] = key;
    133                   }
    134               }
    135           }
    136           return array;
    137       }
    138 }
    139 testArrs = [];
    140 for (var i = 0; i < 5000; i++) {
    141   testArrs.push(Math.random());
    142 };
    143 console.log(+new Date());
    144 Sort.prototype.systemSort(testArrs);
    145 console.log(+new Date());
    146 Sort.prototype.bubbleSort(testArrs);
    147 console.log(+new Date());
    148 Sort.prototype.quickSort(testArrs);
    149 console.log(+new Date());
    150 ss = Sort.prototype.insertSort(testArrs);
    151 //console.log(ss.toString);
    152 console.log(+new Date());
    153 oo = Sort.prototype.shellSort(testArrs);
    154 console.log(+new Date());
    155 //console.log(oo.toString());

    打印的数据如下:

    1390474099605
    1390474099614
    1390474099720
    1390474099759
    1390474099760
    1390474099761
    可以看出,冒泡排序耗时最高106,耗时最少的是插入排序,希尔排序也不错,sort函数的排序时间9,相比起来和插入排序差别不是很大,所以在js中用sort来实现排序,在要求不是很高的情况下都是ok的。
  • 相关阅读:
    Caveat,bug,DDTS
    思科WLC如何实现WEB无感知认证?
    Cat9100 AP的注意事项!
    Docker基本操作命令
    基于Docker Toolbox部署PXC集群(三)Navicat连接Docker中的MySql实例
    MySql自带压力测试工具mysqlslab
    基于Docker Toolbox部署PXC集群(一)基本概念【转】
    基于Docker Toolbox部署PXC集群(二)PXC安装及节点配置
    使用Outlook EWS获取会议及会议室信息
    Tag镜像时默认为latest版本问题
  • 原文地址:https://www.cnblogs.com/fredshare/p/3531594.html
Copyright © 2020-2023  润新知