归并排序 自顶向下 数组实现

归并排序 自顶向下 数组实现


归并(即Merge函数)
二路归并排序举例:分为有序子表A,有序子表B。A中首个元素与B中首个元素比较;若A1小于B1,取出A1,比较A2与B1;若A1大于B1,取出B1,比较A1与B2。依次类推。
递归(即MergeSort函数)
分解问题

#include <stdio.h>
#include <malloc.h>//对应malloc函数与free函数的使用
void disp(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void Merge(int a[],int low,int mid,int high)//核心
{
    int *tmpa;//此处的*,使tmpa以数组的形式定义下来
    int i=low,j=mid+1,k=0;
    tmpa=(int *)malloc((high-low+1)*sizeof(int));
    while(i<=mid&&j<=high)
    {
        if(a[i]<=a[j])
        {
            tmpa[k]=a[i];
            i++;
            k++;
        }
        else
        {
            tmpa[k]=a[j];
            j++;
            k++;
        }
    }
    while(i<=mid)//使左侧的剩余复制下来
    {
        tmpa[k]=a[i];
        i++;
        k++;
    }
    while(j<=high)//使右侧的剩余复制下来
    {
        tmpa[k]=a[j];
        j++;
        k++;
    }
    for(k=0,i=low;i<=high;k++,i++)//将数据从临时存储放入数组a
        a[i]=tmpa[k];
    free(tmpa);
}

void MergeSort(int a[],int low,int high)//递归调用
{
    int mid;
    if(low<high)
    {
        mid=(low+high)/2;
        MergeSort(a,low,mid);
        MergeSort(a,mid+1,high);
        Merge(a,low,mid,high);
    }
}

void main()
{
    int n;
    int a[100];
    int x=0;
    scanf("%d",&n);
    for(;x<n;x++)
        scanf("%d",&a[x]);
    disp(a,n);
    MergeSort(a,0,n);
    disp(a,n);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值