经典排序算法之归并排序(Merge Sort)

**归并算法定义:**所谓归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。

这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。

归并排序相比较之前的排序算法而言加入了分治法的思想,其算法思路如下:

1.如果给的数组只有一个元素的话,直接返回(也就是递归到最底层的一个情况)

2.把整个数组分为尽可能相等的两个部分(分)

3.对于两个被分开的两个部分进行整个归并排序(治)

4.把两个被分开且排好序的数组拼接在一起

代码演示如下:

复制代码
void merge(int arr[], int l, int m, int r) 
{ 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 =  r - m; 

    int L[n1], R[n2]; 

    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1+ j]; 

    i = 0; 
    j = 0; 
    k = l; 
    while (i < n1 && j < n2) 
    { 
        if (L[i] <= R[j]) 
        { 
            arr[k] = L[i]; 
            i++; 
        } 
        else
        { 
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 
  
    while (i < n1) 
    { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 
  
    while (j < n2) 
    { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 
  
void mergeSort(int arr[], int l, int r) 
{ 
    if (l < r) 
    { 
        int m = l+(r-l)/2; 
  
        mergeSort(arr, l, m); 
        mergeSort(arr, m+1, r); 
  
        merge(arr, l, m, r); 
    } 
} 
相关推荐
普通攻击往后拉6 小时前
Leetcode 206. 反转链表
算法·leetcode·链表
@syh.7 小时前
【贪心】矩阵消除游戏
算法·游戏·矩阵
可编程芯片开发7 小时前
基于零极点配置的PID控制系统simulink建模与仿真
算法
徐小夕8 小时前
开源!我用SQLite + DuckDB打造了一款可视化AI问数平台
前端·算法·github
Hrain-AI8 小时前
2026 企业 AI 智能体平台横评:8 大主流平台 7 维度实测对比
人工智能·算法·机器学习
Angel Q.9 小时前
因子分析和生成模型有什么关系?从“幕后因素”到“生成数据”
算法
FBI HackerHarry浩10 小时前
AI大模型开发V2第四阶段线性回归
人工智能·算法·线性回归
Jerry11 小时前
LeetCode 108. 将有序数组转换为二叉搜索树
算法
蓝斯49712 小时前
Diff算法的简单介绍
算法