1. 程式人生 > 其它 >前端常見的排序演算法

前端常見的排序演算法

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]