归并排序的递归写法

首先,我们要理解归并排序的基本逻辑。何为归并排序?归并排序有点类似快排,就是将数组一直二分,但与快排不同的是,快排每次会分出一个中心轴的位置,然后通过中心轴分出来的两组数组继续快排,当分的只剩下一个元素或区间不存在时停止快排。而归并排序不会把中心轴给拿出来,因为他在逐层递归的过程中并没有排序,而是直到只剩下一个元素或区间不存在时才开始逐层排序,往回走。

以下是实现代码:

#include<stdio.h>
#include<stdlib.h>
void Mergesort(int* a, int n);
void Merge_sort(int* a, int* temp, int begin, int end);

int main()
{
    int a[10] = { 1,3,5,7,9,6,4,2,8 };
    int n = 10;
    for (int i = 0;i < n;i++)
    {
        printf("%d",a[i]);
    }
    printf("\n");
    Mergesort(a,n);
    for (int i = 0;i < n;i++)
    {
        printf("%d", a[i]);
    }
    return 0;
}


void Mergesort(int* a, int n)
{
    int* temp = (int*)malloc(sizeof(int) * n);
    if (temp == NULL)
    {
        perror("malloc fail");
        return;
    }
    Merge_sort(a, temp, 0, n - 1);
    free(temp);
    temp = NULL;
}

void Merge_sort(int* a, int* temp, int begin, int end)
{
    if (begin >= end)
        return;
    int mid = (begin + end) / 2;
    Merge_sort(a, temp, begin, mid);
    Merge_sort(a, temp, mid+1, end);
    int begin1 = begin, end1 = mid;
    int begin2 = mid + 1, end2 = end;
    int i = begin;
    while (begin1<=end1&&begin2<=end2)
    {
        if (a[begin1] < a[begin2])
            temp[i++] = a[begin1++];
        else
            temp[i++] = a[begin2++];
    }
    while (begin1 <= end1)
    {
        temp[i++] = a[begin1++];
    }
    while (begin2 <= end2)
    {
        temp[i++] = a[begin2++];
    }
    memcpy(a+begin, temp+begin, (end-begin+1)*sizeof(int));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值