当前位置:首页算法 > 正文

野牛程序员讲少儿编程:归并排序来啦,拆了又合的排序魔法!

作者:野牛程序员:2025-04-25 08:18:45算法阅读 2000
野牛程序员讲少儿编程:归并排序来啦,拆了又合的排序魔法!

🎉 野牛程序员讲少儿编程:归并排序来啦,拆了又合的排序魔法! 🧙‍♂️✨


📢 各位大小程序员,请系好安全带,今天带来一个超级聪明、逻辑缜密、又带点“分裂”气质的排序选手——归并排序(Merge Sort)

它不靠拳头拼蛮力,不像冒泡一样天天打擂台,不像选择插入天天找最小。它走的是高端路线:分而治之,动脑不动手!


🎁 归并排序的核心思想:拆!拆!拆!合!合!合!

📌 用一句话总结就是:

先拆成最小块,再合并成有序数组。


🎬 一步一步讲解给小朋友听听:

🪓 步骤一:分(Divide)

把原始数组一劈两半!
比如数组是 [38, 27, 43, 3, 9, 82, 10]
咔!劈成两部分:

[38, 27, 43]   和   [3, 9, 82, 10]

继续劈下去!直到每一份只剩下1个元素为止👇
(1个元素自己本身就是有序的)


🪢 步骤二:治(Conquer)

从最小的两个开始合并,合并时注意排序!

比如:
[38][27] 合并成 [27, 38]
[3][9] 合并成 [3, 9]

然后再逐步合并更大的部分,最后合成完整有序数组!


🎯 举个例子:

排序 [4, 1, 6, 2] 的过程如下:

🧨 拆解过程:

[4, 1, 6, 2]
→ [4, 1] 和 [6, 2]
→ [4] [1] [6] [2]

🔧 合并过程:

→ [1, 4] 和 [2, 6]
→ [1, 2, 4, 6] ✅ 排序完成!

🧠 代码怎么写?(C++)

#include <iostream>
using namespace std;

void merge(int arr[], int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    int L[n1], R[n2];  // 临时数组

    for (int i = 0; i < n1; i++)
        L[i] = arr[left + i];

    for (int j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];

    int i = 0, j = 0, k = left;

    // 合并两个有序数组
    while (i < n1 && j < n2) {
        if (L[i] <= R[j])
            arr[k++] = L[i++];
        else
            arr[k++] = R[j++];
    }

    // 把剩下的复制回原数组
    while (i < n1)
        arr[k++] = L[i++];

    while (j < n2)
        arr[k++] = R[j++];
}

void mergeSort(int arr[], int left, int right) {
    if (left >= right)
        return;

    int mid = left + (right - left) / 2;

    mergeSort(arr, left, mid);         // 拆左边
    mergeSort(arr, mid + 1, right);    // 拆右边
    merge(arr, left, mid, right);      // 合并
}

int main() {
    int arr[] = {38, 27, 43, 3, 9, 82, 10};
    int size = sizeof(arr) / sizeof(arr[0]);

    mergeSort(arr, 0, size - 1);

    cout << "排序结果:";
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";

    return 0;
}

🔍 小贴士时间

🧩 时间复杂度:O(n log n),超级快!
🧩 空间复杂度:O(n),因为用了临时数组
🧩 排序稳定,适合大数据、追求精度的场合!


🧒 小朋友怎么记?

  • 像拆拼图一样把数组拆成小块

  • 然后像拼拼图一样一块块有序拼回去

  • 拼得越整齐,程序越开心!🧩


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 野牛程序员讲少儿编程:归并排序来啦,拆了又合的排序魔法!
  • 相关推荐

    最新推荐

    热门点击