欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 归并排序法

归并排序法

2025/5/22 13:53:15 来源:https://blog.csdn.net/2501_92023416/article/details/148042530  浏览:    关键词:归并排序法

归并是将两个或多个有序记录序列合并成一个有序序列。归并方法有多种,一次对两个有序记录序列进行归并,称为二路归并排序,也有三路归并排序及多路归并排序。本实例是二路归并排序,基本方法如下:

(1)将n个记录看成是n个长度为1的有序子表。

(2)将两两相邻的有序子表进行归并。

(3)重复执行步骤(2),直到归并成一个长度为n的有序表。

 

以下是归并排序法的C语言实现代码,包含合并和排序两个核心函数:
 
#include <stdio.h>

// 合并两个有序子数组
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) {
        int mid = left + (right - left) / 2; // 避免溢出
        mergeSort(arr, left, mid);       // 递归排序左半部分
        mergeSort(arr, mid + 1, right);  // 递归排序右半部分
        merge(arr, left, mid, right);    // 合并有序数组
    }
}
int main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    printf("排序前数组:");
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    
    mergeSort(arr, 0, n - 1);
    
    printf("\n排序后数组:");
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    return 0;
}
 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词