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



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

    一、归并排序原理

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

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

    二、归并排序实现

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

    #include 
    #include 
    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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    三、归并排序优化

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

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

    四、总结

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

  • 相关阅读:
    JS 中 对象 基础认识
    软件测试和硬件测试的区别及概念
    php校园一卡通系统
    PostgreSql linux 常用命令
    uniapp移动端实现上拉加载(分页),下拉刷新
    【linux命令讲解大全】105.掌握磁盘配额管理的edquota命令
    Oracle/PLSQL: Avg Function
    【无标题】
    【shell】限制任务并发
    【分布式任务调度】(二)XXL-JOB执行器配置及定时任务的创建
  • 原文地址:https://blog.csdn.net/qq_40205510/article/details/137967227