【C语言】归并排序算法实现

归并排序(Merge Sort)是一种经典的排序算法,由于其采用了分治策略,因此在处理大数据集时表现出了较好的性能。本文将详细介绍归并排序的原理、实现以及优化方法,并以 C 语言为例给出代码实现。

一、归并排序原理

归并排序的核心思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再把有序子序列合并成一个整体有序的序列。具体步骤如下:

  1. 将待排序序列分成若干个子序列,每个子序列只有一个元素,认为这些子序列是有序的。
  2. 将相邻的子序列两两合并,合并过程中保持有序,得到若干个长度为 2 的有序子序列。
  3. 重复步骤 2,直至得到一个长度为 n 的有序序列。

二、归并排序实现

下面给出归并排序的 C 语言实现:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
void Merge(int *arr, int left, int mid, int right) {
    int i, j, k;
    int n1 = mid - left + 1;
    int n2 = right - mid;
    // 创建临时数组
    int L[n1], R[n2];
    // 将原数组元素复制到临时数组中
    for (i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (j = 0; j < n2; j++) {
        R[j] = arr[mid + 1 + j];
    }
    // 合并临时数组
    i = 0;
    j = 0;
    k = left;
    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 left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;
        MergeSort(arr, left, mid);
        MergeSort(arr, mid + 1, right);
        Merge(arr, left, mid, right);
    }
}
int main() {
    int arr[] = {9, 7, 5, 3, 1, 2, 4, 6, 8};
    int n = sizeof(arr) / sizeof(arr[0]);
    MergeSort(arr, 0, n - 1);
    printf("Sorted array: \n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

三、归并排序优化

归并排序在处理大数据集时,递归过程可能会导致函数调用栈溢出。为了避免这种情况,可以使用迭代的方式实现归并排序,减少函数调用次数。此外,还可以采用以下优化策略:

  1. 当待排序序列长度较小时,可以采用插入排序代替归并排序。
  2. 在合并过程中,如果左半部分的最大值小于等于右半部分的最小值,则不需要合并。

四、总结

归并排序是一种效率较高的排序算法,时间复杂度为 O( n l o g n nlog_n nlogn),在处理大数据集时表现出了较好的性能。通过采用迭代方式以及优化策略,可以进一步提高归并排序的性能。在实际应用中,归并排序常用于外部排序场景,如磁盘文件排序。

相关推荐
SsummerC31 分钟前
【leetcode100】组合总和Ⅳ
数据结构·python·算法·leetcode·动态规划
2301_807611491 小时前
77. 组合
c++·算法·leetcode·深度优先·回溯
YuforiaCode2 小时前
第十三届蓝桥杯 2022 C/C++组 修剪灌木
c语言·c++·蓝桥杯
SsummerC3 小时前
【leetcode100】零钱兑换Ⅱ
数据结构·python·算法·leetcode·动态规划
好易学·数据结构3 小时前
可视化图解算法:二叉树的最大深度(高度)
数据结构·算法·二叉树·最大高度·最大深度·二叉树高度·二叉树深度
程序员-King.3 小时前
day47—双指针-平方数之和(LeetCode-633)
算法·leetcode
阳洞洞4 小时前
leetcode 1035. Uncrossed Lines
算法·leetcode·动态规划·子序列问题
小鹿鹿啊4 小时前
C语言编程--15.四数之和
c语言·数据结构·算法
rigidwill6664 小时前
LeetCode hot 100—最长有效括号
数据结构·c++·算法·leetcode·职场和发展
T.Ree.5 小时前
【数据结构】_树和二叉树
c语言·开发语言·数据结构