归并排序递归实现

本文介绍了一种使用C语言实现的归并排序算法。通过递归地将数组分为两部分进行排序,然后合并两个有序数组来完成整个数组的排序过程。文章提供了完整的代码示例,并演示了如何对一个包含10个元素的整数数组进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#define MAXSIZE 10


void merging(int *list1, int list1_size, int *list2, int list2_size) {
    int i,j,k,m;
    int temp[MAXSIZE];

    i=j=k=0;

    while( i<list1_size && j<list2_size ){

        if( list1[i] < list2[j] ) {
            temp[k++] = list1[i++];
        }
        else {
            temp[k++] = list2[j++];
        }
    }

    while(i<list1_size) {
        temp[k++] = list1[i++];
    }
    while( j < list2_size) {
        temp[k++] = list2[j++];
    }

    for(m=0;m<(list1_size+list2_size);m++){
        list1[m] = temp[m];
    }
}

void MergeSort(int a[], int n) {

    if (n>1){
        int *list1 = a;
        int list1_size = n/2;
        int *list2 = a + n/2;
        int list2_size = n - list1_size;

        MergeSort(list1,list1_size);
        MergeSort(list2,list2_size);

        merging(list1,list1_size,list2,list2_size);
    }

}

int main() {

    int i;

    int a[10] = {43,56,7,54,34,78,56,78,12,65};

    printf("排序后:");

    MergeSort(a,10);

    for( i=0; i<10; i++) {
        printf("%d ",a[i]);
    }

    printf("\n");
}
### 归并排序递归实现 归并排序是一种分治算法,其核心思想是将数组分成两部分分别进行排序,然后再将这两部分合并成一个有序的整体。以下是基于 C 语言的归并排序递归实现: #### 完整代码示例 ```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) { // 如果只有一个元素,则无需再分割 return; } int mid = left + (right - left) / 2; // 计算中间位置 mergeSort(arr, left, mid); // 对左半部分递归排序 mergeSort(arr, mid + 1, right); // 对右半部分递归排序 merge(arr, left, mid, right); // 合并已排序的部分 } // 测试程序 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {38, 27, 43, 3, 9, 82, 10}; int n = sizeof(arr) / sizeof(arr[0]); printf("Original Array:\n"); printArray(arr, n); mergeSort(arr, 0, n - 1); printf("Sorted Array:\n"); printArray(arr, n); return 0; } ``` 上述代码实现归并排序的核心逻辑 `merge` 函数以及递归调用的 `mergeSort` 函数[^1]。 --- ### 关键点解析 1. **分解问题**: 将原始数组分为两部分,每部分继续递归地应用相同的策略直到无法进一步划分[^3]。 2. **合并操作**: 使用辅助空间来保存左右两部分的数据,在合并过程中逐步比较并将较小值放入原数组中。 3. **时间复杂度**: 归并排序的时间复杂度为 \(O(n \log n)\),适用于大规模数据集的稳定排序需求[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值