前端常見的排序演算法
阿新 • • 發佈:2022-03-22
1、氣泡排序
- 比較相鄰的兩個元素。如果第一個比第二個大,則交換位置;
- 對每一對相鄰元素重複第一個步驟,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
- 針對所有的元素重複以上的步驟,除了最後一個;
- 重複步驟1~3,直到排序完成。
/** * 外迴圈控制需要比較的元素,比如第一次排序後, 最後一個元素就不需要比較了,內迴圈則負責兩兩元素比較,將元素放到正確位置上 */ function bubbleSort(arr) { const len = arr.length for(let i=0; i<len; i++) { for(let j=0;j<len-1-i; j++) { // 注意邊界值 if(arr[j] > arr[j+1]){ [arr[j],arr[j+1]] = [arr[j+1],arr[j]] // 交換位置 } } } return arr } console.log(bubbleSort([3,44,15,36,26,27,2,46,4,19,50,48])) //[2,3,4,15,19,26,27,36,44,46,48,50]
時間複雜度:O(n^2)
2、快速排序
-
選擇一個參考元素,將列表分割成兩個子序列;
-
對列表重新排序,將所有小於基準值的元素放在基準值前面,所有大於基準值的元素放在基準值的後面;
-
分別對較小元素的子序列和較大元素的子序列重複步驟1和2
function quickSort(arr) { if(arr.length<=1) return arr const left = [],right = [],current = arr.splice(0,1) for(let i=0; i<arr.length; i++) { if(arr[i]<current) { // 小於參考值放左邊 left.push(arr[i]) }else{ // 否則放右邊 right.push(arr[i]) } } //遞迴上述步驟 return quickSort(left).concat(current,quickSort(right)) } console.log(quickSort([3,44,15,36,26,27,2,46,4,19,50,48])) //[2, 3, 4, 15, 19, 26, 27, 36, 44, 46, 48, 50]
時間複雜度:O(nlogn)
3、插入排序
-
從第一個元素開始,該元素可以認為已經被排序;
-
取出下一個元素,在已經排序的元素序列中從後向前掃描;
-
如果該元素(已排序)大於新元素,將該元素移到下一位置;
-
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
-
將新元素插入到該位置後;
-
重複步驟2~5。
/**雙層迴圈,外迴圈控制未排序的元素,內迴圈控制已排序的元素,將未排序元素設為標杆, 與已排序的元素進行比較,小於則交換位置,大於則位置不動 */ function insertSort(arr) { let tem for(let i=0; i<arr.length; i++) { tem = arr[i] for(let j=i; j>=0; j--){ if(arr[j-1] > tem){ arr[j] = arr[j-1] }else { arr[j] = tem break } } } return arr } console.log(insertSort([3,44,15,36,26,27,2,46,4,19,50,48])) //[2, 3, 4, 15, 19, 26, 27, 36, 44, 46, 48, 50]