您好,欢迎访问一九零五行业门户网

js 各种排序方法和sort方法的区别详解

今天突发奇想,想明白sort方法是否比各种排序都有优势,本文主要为大家分享一篇基于js 各种排序方法和sort方法的区别(详解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。
<!doctype html> <html lang="en"> <head>   <meta charset="utf-8">   <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">   <title>图片列表生成交互组件</title>   <style>     * {       margin: 0;       border: 0;     }     html, body {       height: 100%;     }     #p {       height: 100%;       width: 100%;     }   </style> </head> <body> <p id="p"></p> <script src="myneedextend.js"></script> <script>   // ---------- 一些排序算法   sort = {     // 利用sort进行排序     systemsort:function(array){       return array.sort(function(a, b){         return a - b;       });     },     // 冒泡排序     bubblesort:function(array){       var i = 0, len = array.length,         j, d;       for(; i<len; i++){ for(j=0; j<len; j++){ if(array[i] < array[j]){ d = array[j]; array[j] = array[i]; array[i] = d; } } } return array; }, // 快速排序 quicksort:function(array){ //var array = [8,4,6,2,7,9,3,5,74,5]; //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]; var i = 0; var j = array.length - 1; var sort = function(i, j){ // 结束条件 if(i == j ){ return }; var key = array[i]; var tempi = i; // 记录开始位置 var tempj = j; // 记录结束位置 while(j > i){           // j <<-------------- 向前查找 if(array[j] >= key){             j--;           }else{             array[i] = array[j]             //i++ ------------>>向后查找             while(j > ++i){               if(array[i] > key){                 array[j] = array[i];                 break;               }             }           }         }         // 如果第一个取出的 key 是最小的数         if(tempi == i){           sort(++i, tempj);           return ;         }         // 最后一个空位留给 key         array[i] = key;         // 递归         sort(tempi, i);         sort(j, tempj);       }       sort(i, j);       return array;     },     // 插入排序     insertsort:function(array){       // http://baike.baidu.com/image/d57e99942da24e5dd21b7080       // http://baike.baidu.com/view/396887.htm       // 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];       var i = 1, j, temp, key, len = array.length;       for(; i < len; i++){ temp = j = i; key = array[j]; while(--j > -1){           if(array[j] > key){             array[j+1] = array[j];           }else{             break;           }         }         array[j+1] = key;       }       return array;     },     // 希尔排序     shellsort:function(array){       // http://zh.wikipedia.org/zh/%e5%b8%8c%e5%b0%94%e6%8e%92%e5%ba%8f       // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];       // var temparr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];       // reverse() 在维基上看到这个最优的步长 较小数组       var temparr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1];       //针对大数组的步长选择       var i = 0;       var temparrlength = temparr.length;       var len = array.length;       var len2 = parseint(len/2);       for(;i < temparrlength; i++){ if(temparr[i] > len2){           continue;         }         tempsort(temparr[i]);       }       // 排序一个步长       function tempsort(temp){         //console.log(temp) 使用的步长统计         var i = 0, j = 0, f, tem, key;         var templen = len%temp > 0 ? parseint(len/temp) + 1 : len/temp;         for(;i < temp; i++){// 依次循环列 for(j=1;/*j < templen && */temp * j + i < len; j++){ //依次循环每列的每行 tem = f = temp * j + i; key = array[f]; while((tem-=temp) >= 0){               // 依次向上查找               if(array[tem] > key){                 array[tem+temp] = array[tem];               }else{                 break;               }             }             array[tem + temp ] = key;           }         }       }       return array;     }   };   testarrs = [];   for (var i = 10000000; i > 0; i--) {     testarrs.push(i);   }   function test(fun,arr) {     console.log(arr);     var oldtime = +new date();     var new_arr = sort[fun](arr);     var newtime = +new date();     console.log(new_arr);     console.log(newtime-oldtime);   }   /*   * sort排序 systemsort   * 冒泡排序 bubblesort   * 快速排序 quicksort   * 插入排序 insertsort   * 希尔排序 shellsort   *   * */   test(systemsort,testarrs); </script> </body> </html>
上面的方法通过测试时间,然后分析哪个排序方法省时,时间就是生命,用对正确的方法,就能省下好多时间,尤其是大数据运行的时候。
首先看运行处理10000个长度数组时的所用的时间:
* sort排序 systemsort 11
* 冒泡排序 bubblesort 169
* 快速排序 quicksort 144
* 插入排序 insertsort 139
* 希尔排序 shellsort 3
测试十万长的数组数据:
* sort排序 systemsort 63
* 冒泡排序 bubblesort 16268
* 快速排序 quicksort 直接报错
* 插入排序 insertsort 13026
* 希尔排序 shellsort 8
测试一百万的长度的数组:
* sort排序 systemsort 575
* 冒泡排序 bubblesort 时间未知
* 快速排序 quicksort 直接报错
* 插入排序 insertsort 直接崩溃
* 希尔排序 shellsort 93
测试一千万长的数组:
* sort排序 systemsort 7039
* 冒泡排序 bubblesort 没测
* 快速排序 quicksort 没测
* 插入排序 insertsort 没测
* 希尔排序 shellsort 1225
测试一亿长的数组:
* sort排序 systemsort 直接崩溃
* 冒泡排序 bubblesort 没测
* 快速排序 quicksort 没测
* 插入排序 insertsort 没测
* 希尔排序 shellsort 19864
最后通过测试,在最坏的情况下,发现希尔排序还是最好,竟然比系统的sort排序都快,确实令人惊讶,大家这样就能看出来在什么情况需要使用什么方法进行排序了吧
然后我们进行随机情况进行测试:
<!doctype html> <html lang="en"> <head>   <meta charset="utf-8">   <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">   <title>图片列表生成交互组件</title>   <style>     * {       margin: 0;       border: 0;     }     html, body {       height: 100%;     }     #p {       height: 100%;       width: 100%;     }   </style> </head> <body> <p id="p"></p> <script src="myneedextend.js"></script> <script>   // ---------- 一些排序算法   sort = {     // 利用sort进行排序     systemsort:function(array){       return array.sort(function(a, b){         return a - b;       });     },     // 冒泡排序     bubblesort:function(array){       var i = 0, len = array.length,         j, d;       for(; i<len; i++){ for(j=0; j<len; j++){ if(array[i] < array[j]){ d = array[j]; array[j] = array[i]; array[i] = d; } } } return array; }, // 快速排序 quicksort:function(array){ //var array = [8,4,6,2,7,9,3,5,74,5]; //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]; var i = 0; var j = array.length - 1; var sort = function(i, j){ // 结束条件 if(i == j ){ return }; var key = array[i]; var tempi = i; // 记录开始位置 var tempj = j; // 记录结束位置 while(j > i){           // j <<-------------- 向前查找 if(array[j] >= key){             j--;           }else{             array[i] = array[j]             //i++ ------------>>向后查找             while(j > ++i){               if(array[i] > key){                 array[j] = array[i];                 break;               }             }           }         }         // 如果第一个取出的 key 是最小的数         if(tempi == i){           sort(++i, tempj);           return ;         }         // 最后一个空位留给 key         array[i] = key;         // 递归         sort(tempi, i);         sort(j, tempj);       }       sort(i, j);       return array;     },     // 插入排序     insertsort:function(array){       // http://baike.baidu.com/image/d57e99942da24e5dd21b7080       // http://baike.baidu.com/view/396887.htm       // 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];       var i = 1, j, temp, key, len = array.length;       for(; i < len; i++){ temp = j = i; key = array[j]; while(--j > -1){           if(array[j] > key){             array[j+1] = array[j];           }else{             break;           }         }         array[j+1] = key;       }       return array;     },     // 希尔排序     shellsort:function(array){       // http://zh.wikipedia.org/zh/%e5%b8%8c%e5%b0%94%e6%8e%92%e5%ba%8f       // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];       // var temparr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];       // reverse() 在维基上看到这个最优的步长 较小数组       var temparr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1];       //针对大数组的步长选择       var i = 0;       var temparrlength = temparr.length;       var len = array.length;       var len2 = parseint(len/2);       for(;i < temparrlength; i++){ if(temparr[i] > len2){           continue;         }         tempsort(temparr[i]);       }       // 排序一个步长       function tempsort(temp){         //console.log(temp) 使用的步长统计         var i = 0, j = 0, f, tem, key;         var templen = len%temp > 0 ? parseint(len/temp) + 1 : len/temp;         for(;i < temp; i++){// 依次循环列 for(j=1;/*j < templen && */temp * j + i < len; j++){ //依次循环每列的每行 tem = f = temp * j + i; key = array[f]; while((tem-=temp) >= 0){               // 依次向上查找               if(array[tem] > key){                 array[tem+temp] = array[tem];               }else{                 break;               }             }             array[tem + temp ] = key;           }         }       }       return array;     }   };   testarrs = [];   for (var i = 0; i < 10000000; i++) {     testarrs.push(math.random());   }   function test(fun,arr) {     var oldtime = +new date();     var new_arr = sort[fun](arr);     var newtime = +new date();     console.log(fun);     console.log(newtime-oldtime);   }   /*   * sort排序 systemsort   * 冒泡排序 bubblesort   * 快速排序 quicksort   * 插入排序 insertsort   * 希尔排序 shellsort   *   * */   test(systemsort,testarrs);   //test(bubblesort,testarrs);   //test(quicksort,testarrs);   test(insertsort,testarrs);   test(shellsort,testarrs); </script> </body> </html>
测试一千万长的数组:
* sort排序 systemsort 8842
* 冒泡排序 bubblesort 没测
* 快速排序 quicksort 没测
* 插入排序 insertsort 45
* 希尔排序 shellsort 1133
在未知的情况和比较好的情况下,插入排序的效率最高
相关推荐:
php 数组排序方法总结
javascript算法中的排序方法使用详解
php数组函数介绍和数组排序方法总结
以上就是js 各种排序方法和sort方法的区别详解的详细内容。
其它类似信息

推荐信息