每天进步一点点

前言

最近在学习算法, 不得不说, 怪难来, 不过, 也很妙, 感觉这些知识太难了, 学会了, 还容易忘, 我觉定记录一下, 争取用最清晰,最简单的语言来描述我学习到的思想

归并排序

这个排序的思想大概是, 利用递归分治思想, 实现排序的过程, 大致过程是先把数组分割成不可分割单位, 打比方 [3,1,4,2,6,5]这个数组, 先分成独立的每个数, 然后合并, 在合并的过程中排序.
宏观理解成 把数组看成两半, 左边排好序, 右边排好序, 然后有一个merge过程让整体有序

merge过程是用两个指针, 一个指向左边数组的开头, 一个指向右边数组的开头
谁小复制谁, 从头复制到尾, 就排好序了

实现

function mergeSort(arr) {
    if (!arr || arr.length < 2) {
        return
    }
    
    process(arr, 0, arr.length - 1)
}

function process(arr, l, r) {
    // base case l和r相等的时候,停止分割
    if (l == r) {
        return
    }
    let mid = Math.floor((l + r) / 2)
    process(arr, l, mid)  
    process(arr, mid + 1, r) 
    merge(arr, l, mid, r)
}

function merge(arr, l, m, r) {
    let help = Array(r - l + 1),
        i = 0,
        p1 = l,
        p2 = m + 1
    while (p1 <= m && p2 <= r) {
        help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]
    }
    
    while (p1 <= m) {
        help[i++] = arr[p1++]
    }
    while (p2 <= r) {
        help[i++] = arr[p2++]
    }
    
    for (i = 0; i < help.length; i++) {
        arr[l + i] = help[i]
    }
}

function test() {
    let arr = [9, 8, 7, 6, 5, 4, 3, 2, 1]
    console.log("before sort", arr)
    mergeSort(arr)
    console.log("after sort", arr)
}
test()

图解

posted on 2023-09-27 18:03  柯蓝僧人  阅读(6)  评论(0编辑  收藏  举报