归并排序

将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。

之后,将A,B组各自再分成二组。

依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

#include<stdio.h>
#include<stdlib.h>
void GuiBing(int a[],int first,int mid,int last,int c[])
{
    int i=first;
    int j=mid+1;
    int m=mid;
    int n=last;
    int k=0;

    while((i<=m)&&(j<=n))
    {
        if(a[i]<=a[j])
            c[k++]=a[i++];
        else
            c[k++]=a[j++];
    }

    while(i<=m)
        c[k++]=a[i++];
    while(j<=n)
        c[k++]=a[j++];

    for(int l=0;l<k;l++)
        a[first+l]=c[l];
}

void Divide(int a[],int first,int last,int c[])
{
    if(first<last)
    {
        int mid=(first+last)/2;
        Divide(a,first,mid,c);
        Divide(a,mid+1,last,c);
        GuiBing(a,first,mid,last,c);
    }
}

int main()
{
    int paixu[]={10,54,2,59,6,325,489,0,266,12,32,88};
    int temp[12];
    Divide(paixu,0,11,temp);
    for(int i=0;i<12;i++)
        printf("%d,",temp[i]);
    return 0;
}

参考:

https://blog.csdn.net/morewindows/article/details/6678165

原文地址:https://www.cnblogs.com/zzdbullet/p/9949757.html