(算法)冒泡、选择、插入排序

91 阅读1分钟

冒泡排序

重复比较相邻的两个项。

编码:

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

冒泡改进版:

const betterBubbleSort = (arr) => {
    for(let i = 0; i < arr.length; i++){
        let flag = false;
        for(let j = 0; j < arr.length - 1 - i; i++){
            if(arr[j] > arr[j + 1]){
                [arr[j], arr[j+1]] = [arr[j+1],arr[j]];
                //如果未产生交换说明该数组有序
                flag = true;
            }
        }
        // 如果是有序则返回
        if(flag) return arr;
    }
    return arr;
}

规则:

在第一次冒泡的时候就定位到数组是否完全有序,省掉不必要的判断逻辑,时间复杂度定向优化为 O(n)。

选择排序

每次都找出当前范围内的最小值,把它放在当前范围的头部;然后缩小排序范围,继续重复以上操作,直至数组完全有序为止。

编码:

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

规则:

优化:另可使用变量存储最小索引值,判断最小索引与当前索引是否相等,不相等则交换,减少交换操作的性能消耗。

插入排序

选择后面的元素插入到前面并保证有序。

编码:

const insertSort = (arr) => {
    //i从1开始,默认单个数为有序,如[5]
    for(let i = 1; i < arr.length; i++){
        let j = i;
        let temp = arr[i];
        while(j > 0 && arr[j-1] > temp){
            // 前一位数比当前temp值大时,向后挪动位置
            arr[j] = arr[j-1];
            j--;
        }
        // 把temp插入有序位置
        arr[j] = temp;
    }
    
    return arr;
}

规则:

基于当前元素前面的序列是有序的这个前提,从后往前去寻找当前元素在前面那个序列里的正确位置。