1. 程式人生 > >js中常見的排序演算法

js中常見的排序演算法

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));