【基础算法练习】归并排序模板

文章目录

  • 归并模板题
  • 归并排序的思想
    • 静态逻辑图:
    • 动态逻辑图:
  • C++ 版本的归并
  • Golang 版本的归并

归并模板题

第一道题,所有排序都适合在这里练习:912. 排序数组
第二道题,使用归并排序思想的题目:148. 排序链表

归并排序的思想

归并排序的核心思想也是分治,首先通过不断的递归将数组划分成无数的子数组,让两个小的子数组合并成一个有序的子数组,通过不断的归并,获得更多的排序好的子数组,直到他们归并成最终需要排序的大数组,就完成了排序的操作

静态逻辑图:

【基础算法练习】归并排序模板_第1张图片

动态逻辑图:

【基础算法练习】归并排序模板_第2张图片

C++ 版本的归并

const int N = 100010
vector<int> tmp(N);

void mergeSort(int l, int r, vector<int>& nums) {
    if (l >= r) return;
    
    int mid = (l + r) / 2;
    
    mergeSort(l, mid, nums), mergeSort(mid + 1, r, nums);
    
    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r) {
        if (nums[i] < nums[j]) tmp[k++] = nums[i++];
        else tmp[k++] = nums[j++];
    }
    while (i <= mid) tmp[k++] = nums[i++];
    while (j <= r) tmp[k++] = nums[j++];
    
    for (i = l, k = 0; i <= r; i++, k++) nums[i] = tmp[k];
}

Golang 版本的归并

var tmp [100010]int

func mergeSort(l, r int, nums []int) {
    if l >= r {
        return
    }
    
    mid := (l+r)/2
    mergeSort(l, mid, nums)
    mergeSort(mid+1, r, nums)

    k, i, j := 0, l, mid+1
    for i <= mid && j <= r {
        if nums[i] < nums[j] {
            tmp[k] = nums[i]
            k++
            i++
        } else {
            tmp[k] = nums[j]
            k++
            j++
        }
    }
    for i <= mid {
        tmp[k] = nums[i]
        k++
        i++
    }
    for j <= r {
        tmp[k] = nums[j]
        k++
        j++
    }
    for i, k := l, 0; i <= r; {
        nums[i] = tmp[k]
        i++
        k++
    }
}

用 go 写归并排序,我的评价是,++ 操作真是折磨,C++ 代码看着比较舒适一点,go 代码 ++ 操作多了,真的太冗长了

你可能感兴趣的:(基础算法练习,算法)