js中常見的排序演算法
阿新 • • 發佈:2018-12-25
1. 氣泡排序
開始交換的區間為0~N-1,將第1個數和第2個數進行比較,前面大於後面,交換兩個數,否則不交換。再比較第2個數和第三個數,前面大於後面,交換兩個數否則不交換,依次進行。
a.時間複雜度:平均時間複雜度是O(n^2),在最佳狀態時,時間複雜度也會縮小到O(n);
b.空間複雜度:由於輔助空間為常數,所以空間複雜度是O(1);
var arr=[1,2,333,100,34,6,78,0]; // 9 10 8 // 1.為什麼外層迴圈長度需要減1?減少不必要的迴圈(8,14,7,三個數其實只要比較兩次) // 2.為什麼不直接使用第二層迴圈進行排序呢?只是兩兩比較如,(8,14,7),結果(8,7,14),並沒有預期的排序效果。 function bubbleSort(arr){ for(var i=0;i<arr.length-1;i++){ for(var k=0;k<arr.length-1-i;k++){ if(arr[k]>arr[k+1]){ var temp=arr[k]; arr[k]=arr[k+1]; arr[k+1]=temp; } } } return arr; }
這種排序有個問題,如果陣列是 [9,8,7,6,5,4,3,2],則排一次後就已經是我們需要的結果了。
如果某一趟排序後,我們發現沒有交換位置,則說明待排序中所有的項已經是排序過的了,則沒必要進行下去。
function bubbleSort(arr){ for(var i=0;i<arr.length-1;i++){ // 每一趟迴圈前都需要重置標誌位 let shouldSort=false; for(var k=0;k<arr.length-1-i;k++){ if(arr[k]>arr[k+1]){ var temp=arr[k]; arr[k]=arr[k+1]; arr[k+1]=temp; shouldSort=true; } } // 在本輪迴圈後,如果沒有發生位置變化,則停止執行了 if(!shouldSort){ console.log("已經完成目標了,休息一下吧"); break; } } return arr; }
快速排序(遞迴)
時間複雜度
a.最優情況下的時間複雜度為O(nlogn)
b.最差情況下,每次選取的基數都是陣列中的最大或最小值,整個排序過程退化為插入排序,遞迴迭代時間複雜度為O(n),左右指標向基數移動的時間複雜度為O(n),故快排最差情況下的時間複雜度為O(n^2)
平均複雜度: 快速排序的平均時間複雜度也是:O(nlogn)
空間複雜度:
a.最優的情況下空間複雜度為:O(logn)
b.最差的情況下空間複雜度為:O( n )
const arr = [30, 32, 6, 24, 37, 32, 45, 21, 38, 23, 47]; function quickSort(arr){ if(arr.length <= 1){ return arr; } let temp = arr[0]; const left = []; const right = []; for(var i = 1; i < arr.length; i++){ if(arr[i] > temp){ right.push(arr[i]); }else{ left.push(arr[i]); } } return quickSort(left).concat([temp], quickSort(right)); } console.log(quickSort(arr));