JavaScript版幾種常見排序演算法分享

來源:互聯網
上載者:User

說明

·  每個瀏覽器測試得出的資料會不一樣。比如我用chrome 測試 一般快速排序都會最快,IE 則根據數組長度有可能希爾最快。

·  不要用太大資料去測試冒泡排序(瀏覽器崩潰了我不管)

個人理解

·  冒泡排序:最簡單,也最慢,貌似長度小於7最優

·  插入排序: 比冒泡快,比快速排序和希爾排序慢,較小資料有優勢

·  快速排序:這是一個非常快的排序方式,V8的sort方法就使用快速排序和插入排序的結合

·  希爾排序:在非chrome下數組長度小於1000,希爾排序比快速更快

·  系統方法:在forfox下系統的這個方法非常快
 

 
  1.  // ---------- 一些排序演算法  
  2.     // js 利用sort進行排序  
  3.      systemSort:function(array){  
  4.         return array.sort(function(a, b){  
  5.             return a - b;  
  6.         });  
  7.     },  
  8.     // 冒泡排序  
  9.     bubbleSort:function(array){  
  10.         var i = 0, len = array.length,  
  11.             j, d;  
  12.         for(; i<len; i++){  
  13.             for(j=0; j<len; j++){  
  14.                 if(array[i] < array[j]){  
  15.                     d = array[j];  
  16.                     array[j] = array[i];  
  17.                     array[i] = d;  
  18.                 }  
  19.             }  
  20.         }  
  21.         return array;  
  22.     },  
  23.     // 快速排序  
  24.     quickSort:function(array){  
  25.         //var array = [8,4,6,2,7,9,3,5,74,5];  
  26.         //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];  
  27.         var i = 0;  
  28.         var j = array.length - 1;  
  29.         var Sort = function(i, j){  
  30.               
  31.             // 結束條件  
  32.             if(i == j ){ return };  
  33.               
  34.             var key = array[i];  
  35.             var tempi = i; // 記錄開始位置  
  36.             var tempj = j; // 記錄結束位置  
  37.               
  38.             while(j > i){  
  39.                 // j <<-------------- 向前尋找  
  40.                 if(array[j] >= key){  
  41.                     j--;  
  42.                 }else{  
  43.                     array[i] = array[j]  
  44.                     //i++ ------------>>向後尋找  
  45.                     while(j > ++i){  
  46.                         if(array[i] > key){  
  47.                             array[j] = array[i];  
  48.                             break;  
  49.                         }  
  50.                     }  
  51.                 }  
  52.             }  
  53.               
  54.             // 如果第一個取出的 key 是最小的數  
  55.             if(tempi == i){  
  56.                 Sort(++i, tempj);  
  57.                 return ;  
  58.             }  
  59.               
  60.             // 最後一個空位留給 key  
  61.             array[i] = key;  
  62.               
  63.             // 遞迴  
  64.             Sort(tempi, i);  
  65.             Sort(j, tempj);  
  66.         }  
  67.           
  68.         Sort(i, j);  
  69.           
  70.         return array;  
  71.     },  
  72.       
  73.     // 插入排序  
  74.     insertSort:function(array){  
  75.           
  76.         // http://baike.baidu.com/image/d57e99942da24e5dd21b7080  
  77.         // http://baike.baidu.com/view/396887.htm  
  78.         //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];  
  79.           
  80.         var i = 1, j, temp, key,  
  81.             len = array.length;  
  82.           
  83.         for(; i < len; i++){  
  84.               
  85.             temp = j = i;  
  86.             key = array[j];  
  87.               
  88.             while(--j > -1){  
  89.                 if(array[j] > key){  
  90.                     array[j+1] = array[j];  
  91.                 }else{  
  92.                     break;  
  93.                 }  
  94.             }  
  95.               
  96.             array[j+1] = key;  
  97.         }  
  98.           
  99.         return array;  
  100.     },  
  101.       
  102.     // 希爾排序  
  103.     //Jun.array.shellSort(Jun.array.df(10000));  
  104.     shellSort:function(array){  
  105.  
  106.         // http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F  
  107.         // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];  
  108.           
  109.         var tempArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];   
  110. // reverse() 在維基上看到這個最優的步長 較小數組  
  111.         //var tempArr = [1031612713, 217378076, 45806244,   
  112. 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]  
  113. //針對大數組的步長選擇  
  114.         var i = 0;  
  115.         var tempArrtempArrLength = tempArr.length;  
  116.         var len = array.length;  
  117.         var len2 =  parseInt(len/2);  
  118.           
  119.         for(;i < tempArrLength; i++){  
  120.             if(tempArr[i] > len2){  
  121.                 continue;  
  122.             }  
  123.               
  124.             tempSort(tempArr[i]);  
  125.         }  
  126.  
  127.         // 排序一個步長  
  128.         function tempSort(temp){  
  129.               
  130.             //console.log(temp) 使用的步長統計  
  131.               
  132.             var i = 0, j = 0, f, tem, key;  
  133.             var tempLen = len%temp > 0 ?  parseInt(len/temp) + 1 : len/temp;   
  134.               
  135.               
  136.             for(;i < temp; i++){// 依次迴圈列  
  137.  
  138.                 for(j=1;/*j < tempLen && */temp * j + i < len; j++){
    //依次迴圈每列的每行  
  139.                     tem = f = temp * j + i;  
  140.                     key = array[f];  
  141.  
  142.                     while((tem-=temp) >= 0){  
  143. // 依次向上尋找  
  144.                         if(array[tem] > key){  
  145.                             array[tem+temp] = array[tem];  
  146.                         }else{  
  147.                             break;  
  148.                         }  
  149.                     }  
  150.                       
  151.                     array[tem + temp ] = key;  
  152.                       
  153.                 }  
  154.             }  
  155.               
  156.         }  
  157.           
  158.         return array;  
  159.           
  160.     } 

原文連結:http://www.cnblogs.com/idche/archive/2011/02/16/1956397.html

【編輯精選】

  1. 10個令人驚奇的HTML5和JavaScript效果
  2. JavaScript對象及繼承教程之內建對象
  3. JavaScript記憶體回收機制深入解讀
  4. JavaScript初學者應注意的七個細節
  5. 寫了10年Javascript未必全瞭解的連續賦值運算
【責任編輯:陳貽新 TEL:(010)68476606】


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。