Skip to content

排序算法

崧云悠揽月
May 12, 2024

目录

冒泡排序

曾在面试中栽过,越简单越容易忽略。

时间复杂度空间复杂度
O(n^2)O(1)
ts
export function bubbleSort(arr: number[]): number[] {
    for (let i = 0; i < arr.length; i++) {
        for (let j = 1; j < arr.length - i; j++) {
            if (arr[j] < arr[j-1]) {
                const temp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = temp;
            }
        }
    }

    return arr;
}

选择排序

时间复杂度空间复杂度
O(n^2)O(1)
ts
export function selectionSort(arr: number[]): number[] {
    for (let i = 0; i < arr.length; i++) {
        let min = i;
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        if (min !== i) {
            [arr[min], arr[i]] = [arr[i], arr[min]];
        }
    }

    return arr;
}

快速排序

时间复杂度空间复杂度
O(log2n)O(1)
ts
export function quickSort(arr: number[], left?: number, right?: number): number[] {
    left = typeof left === 'number' ? left : 0;
    right = typeof right === 'number' ? right : arr.length;

    if (left < right) {
        let pivot = arr[left];
        let lessIdx = left + 1;

        for (let i = left + 1; i < right; i++) {
            if (arr[i] < pivot) {
                [arr[i], arr[lessIdx]] = [arr[lessIdx], arr[i]];
                lessIdx++;
            }
        }

        [arr[left], arr[lessIdx - 1]] = [arr[lessIdx - 1], arr[left]]
    }
    
    return arr;
}
ts
export function quickSortSimple(arr: number[]): number[] {
    if (arr.length <= 1) {
        return arr;
    }

    let pivot = arr[0];
    let left: number[] = [];
    let right: number[] = [];

    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else if (arr[i] > pivot) {
            right.push(arr[i])
        }
    }

    return [...quickSort(left), pivot, ...quickSort(right)];
}

归并排序

时间复杂度空间复杂度
O(log2n)O(n)
ts
export function mergeSort(arr: number[], left?: number, right?: number): number[] {
    left = typeof left === 'number' ? left : 0;
    right = typeof right === 'number' ? right : arr.length;

    if (left >= right) return arr;

    const middle = Math.floor((left + right) / 2);
    mergeSort(arr, left, middle);
    mergeSort(arr, middle + 1, right);

    const result: number[] = [];
    let rightIdx = middle;

    while(left < middle && rightIdx < right)  {
        if (arr[left] < arr[rightIdx]) {
            result.push(arr[left++]);
        } else {
            result.push(arr[rightIdx++])
        }
    }
    while(left < middle) {
        result.push(arr[left++]);
    }
    while(rightIdx < right) {
        result.push(arr[rightIdx++])
    }

    return result;
}

插入排序

时间复杂度空间复杂度
O(n^2)O(1)
ts
export function insertionSort(arr: number[]): number[] {

    for (let i = 1; i < arr.length; i++) {
        let curr = arr[i];
        let j = i;
        while(j > 0 && arr[j] > arr[i]) {
            arr[j + 1] = arr[j--]
        }
        arr[j] = curr;
    }

    return arr;
}

参考