排序八之合并排序

Merge Sort

合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称其为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来实现多路合并排序。

合并排序的基本流程如下:

1:首先将含有n个节点的待排序数据序列看作n个长度为一的有序子表组成,并将它们两两合并,得到长度为二的若干有序子表;

2:然后,在对这些子表进行两两合并,得到长度为四的若干有序子表,……

3:重复上述过程,直到最后子表的长度为n,从而完成排序过程。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 15
void MergeOne(int a[],int b[],int n,int l)
{
    int i,j;
    int k,s,e;
    s=0;
    while(s+l<n)
    {
        e=s+2*l-1;
        if(e>=n)
         e=n-1;
         k=s;
         i=s;
         j=s+l;
         while(i<s+l&&j<=e)
         {
             if(a[i]<=a[j])
                b[k++]=a[i++];
             else
                b[k++]=a[j++];
         }
         while(i<s+l)
          b[k++]=a[i++];
          while(j<=e)
            b[k++]=a[j++];
          s=e+1;
    }
    if(s<n)
    {
        for(;s<n;s++)
        {
            b[s]=a[s];
        }
    }
}
void MergeSort(int a[],int n)
{
    int *p;
    int h,l,f;
    f=0;
    l=1;
    if(!(p=(int *)malloc(sizeof(int)*n)))
    {
        printf("内存分配失败!\n");
        exit(0);
    }
    while(l<n)
    {
        if(f==1)
            MergeOne(p,a,n,l);
        else
           MergeOne(a,p,n,l);
        l=l*2;
        f=1-f;
    }
    if(f)
    {
        for(h=0;h<n;h++)
            a[h]=p[h];
    }
    free(p);
}
int main()
{
    int i;
    int shuzu[SIZE];
    srand(time(NULL));
    for(i=0;i<SIZE;i++)
        shuzu[i]=rand()/1000+100;
    printf("排序后的数组为:\n");
    for(i=0;i<SIZE;i++)
        printf("%d ",shuzu[i]);
    printf("\n");
    MergeSort(shuzu,SIZE);
    printf("排序后的数组为:\n");
    for(i=0;i<SIZE;i++)
        printf("%d ",shuzu[i]);
    printf("\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值