合并排序--分治法思想

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 10000

void Merge(int *A,int p,int q,int r)
{
    int LeftSize=q-p+1+1;
    int RightSize=r-q+1;
    int *Left,*Right;
    int i,j,k;
    
    Left=(int*)malloc(LeftSize*sizeof(int));
    Right=(int*)malloc(RightSize*sizeof(int));

    for(i=0;i<q-p+1;i++)
        Left[i]=A[p+i];
    for(j=0;j<r-q;j++)
        Right[j]=A[q+j+1];
    
    Left[i]=MAXNUM;
    Right[j]=MAXNUM;

    for(k=p,i=0,j=0;k<r+1;k++)
        if(Left[i]<Right[j])
        {
            A[k]=Left[i];
            i++;
        }
        else
        {
            A[k]=Right[j];
            j++;
        }
        free(Left);
        free(Right);
}

void MergeSort(int *A,int p,int r)
{
    int q;
    if(p<r)
    {
        q=(p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        Merge(A,p,q,r);
    }
}
 int main()
 {
     int r[10]={1,2,3,4,5,2,3,4,5,7};
    int i;

    printf(" Before merging sort:");
        for(i=0; i<10; i++)        printf("%-3d",r[i]);
        printf(" ");
        MergeSort(r,0,9);
        printf("After merging sort:");
        for(i=0; i<10; i++)        printf("%-3d",r[i]);
        printf(" ");
        return 0;
    }

原文地址:https://www.cnblogs.com/jkred369/p/3574321.html