1. 程式人生 > >JS實現排序演算法(氣泡排序、快速排序)

JS實現排序演算法(氣泡排序、快速排序)

const a = [21, 3, 242, 3432, 13, 13, 123, 4, 35, 22, 1];

// 氣泡排序
// 核心思想:每次比較相鄰的數,如果它們順序錯誤,就把它們交換過來。如同氣泡一樣往後翻滾。
// 最外層的迴圈,每次至少要讓一個元素歸位。
// 氣泡排序的時間複雜度太高,達到了O(n*n)
const res2 = [...a];
for (let i = 0; i < res2.length - 1; i++) {
    for (let j = 0; j < res2.length - i - 1; j++) {
        if (res2[j] > res2[j + 1]) {
            let t = res2[j];
            res2[j] = res2[j + 1];
            res2[j + 1] = t;
        }
    }
}
console.log(res2);

// 快速排序
// 基於“二分”的思想,每次確認一個基準數,將基準數歸位,然後以基準數為中心點,拆分為兩塊分別進行遞迴繼續將基準數歸位...
//快速排序的每一輪處理其實就是將這一輪的基準數歸位, 直到所有的數都歸位為止, 排序就結束了。
// 平均時間複雜度為O(NlogN)
const res3 = [...a];

function quickSort(arr, left, right) {
    let num = arr[left]; //確認基準數
    let l = left; // 當前基準數的下標
    let r = right; // 儲存上一個基準數的歸位位置。
    if (left > right) {
        return;
    }
    while (left !== right) {
        while (arr[right] >= num && left < right) {
            right--;
        }
        while (arr[left] <= num && left < right) {
            left++;
        }
        if (left < right) {
            let t = arr[right];
            arr[right] = arr[left];
            arr[left] = t;
        }
    }
    // left與right相等時,意味著找到了基準數應該在的位置,此時將基準數歸位。
    arr[l] = arr[left];
    arr[left] = num;

    quickSort(arr, l, left - 1); // left表示當前基準數的歸位位置。
    quickSort(arr, left + 1, r); // r表示上一個基準數的歸位位置。
}
quickSort(res3, 0, res3.length - 1);
console.log(res3);