希爾排序:
定義一個間隔序列,例如是5,3,1。第一次處理,會處理所有間隔為5的,下一次會處理間隔為3的,最后一次處理間隔為1的元素。也就是相鄰元素執行標准插入排序。
在開始最后一次處理時,大部分元素都將在正確的位置,算法就不必對很多元素進行交換,這是比插入元素高級的地方。
時間復雜度O(n*logn)
1 function shellSort(){ 2 var N=arr.length; 3 var h=1; 4 while(h<N/3){ 5 h=3*h+1;//設置間隔 6 } 7 while(h>=1){ 8 for(var i=h; i<N; i++){ 9 for(j=i; j>=h && arr[j]<arr[j-h]; j-=h){ 10 swap(arr, j, j-h); 11 } 12 } 13 h=(h-1)/3; 14 } 15 } 16 function swap(array, i, j){//兩個數調換 17 var temp =array[j]; 18 array[j]=array[i]; 19 array[i]=temp; 20 }
快速排序:
通過遞歸的方式將數據依次分解成包含較小元素和較大元素的不同子序列,不斷重復這個步驟,直到所有數據都是有序的。
選一個基准值,小於基准值的放一個數組里面。大於基准值的放一個數組里面。
時間復雜度O(n*logn)
1 function quickSort(arr){ 2 3 if(arr.length==0){ 4 return []; 5 } 6 var left=[]; 7 var right=[]; 8 var p=arr[0]; 9 for(var i=1; i<arr.length; i++){ 10 if(arr[i]<p){ 11 left.push(arr[i]); 12 }else{ 13 right.push(arr[i]); 14 } 15 } 16 return quickSort(left).concat(p,quickSort(right)); 17 }
快速排序適合用於大型數據集合,在處理小數據集合反而性能會下降。