时间复杂度Log(n²)排序算法

115 阅读1分钟

交换值函数

function swap(arr, a, b) {
    let c = arr[a];
    arr[a] = arr[b];
    arr[b] = c;
}

冒泡排序

冒泡排序原理为从开始数开始,不停与下一个数比较,如果比下一个数大,则与下一个数交换位置,周而复始,直到最后一个数,这时最后一个数为数组中最大数,再次从头开始,比较 n 轮后,数组排序完成。

// 冒泡排序
function bubbleSort(arr) {
    if (!arr || arr.length <= 1) {
        return arr;
    }

    for (let i = arr.length - 1; i > 0; i--) {
        for (let j = 1; j <= i; j++) {
            if (arr[j] < arr[j - 1]) {
                swap(arr, j, j - 1);
            }
        }
    }

    return arr;
}

选择排序

选择排序原理为假定 0 位置的数为数组中最小的数,设最小值位置为 0 ,与后面所有数进行比较,如果后面的数比 0 位置的数小,则更新最小值位置,继续往后比较,直到最后一个数,交换 0 位置和最小值位置的数,这时 0 位置的数则为数组中最小数。再从 1 位置开始继续比较,循环一轮后,数组有序。

// 选择排序
function selectSort(arr) {
    if (!arr || arr.length <= 1) {
        return arr;
    }

    for (let i = 0; i < arr.length; i++) {
        let minIndex = i;
        for (j = i; j < arr.length; j++) {
            if (arr[minIndex] > arr[j]) {
                minIndex = j;
            }
        }
        swap(arr, minIndex, i);
    }
    return arr
}

插入排序

插入排序原理为与前一个数比较,如果比前一个数小,则交换位置,直到大于等于前一个数,循环一轮。

// 插入排序
function insertSort(arr) {
    if (!arr || arr.length <= 1) {
        return arr;
    }

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