分治法与归并排序

#include<stdio.h>
#include<stdlib.h>
/*
**归并排序的主要思想:分治法 Divide and Conquer
**1 Divide: 将数组array[p,q),从中间分开,分成两个子数组sub1[p,r),sub2[r,q);
**2 Conquer: 递归调用merge_sort,直到p+1==q,只有一个元素;
**3 Combine: 对两个有序的子数组[p,r),[r,q)进行合并,得到的结果放到[p,q)中返回
*/
//void merge_sort(int *pa,int *pb);
void merge_sort(int *p,int len);
void order_sort(int *p,int *r,int *q)//对两个子有序数组[p,r)和[r,q)进行整合排序,得到的排序结果复制到[p,q)中
{
    int size=q-p;
    int *buf=malloc(size*sizeof(int));
    int *pBuf=buf;
    int *pa=p,*pb=r;
    while(pa!=r && pb!=q)
    {
        if(*pa<*pb)    //将pa指向的内容复制到pBuf中,pBuf++,pa++
            *pBuf++=*pa++;
        else
            *pBuf++=*pb++;    
    }
    if(pa==r)    //若pa先结束,则将pb剩余的值全部复制到pBuf中
    {
        while(pb!=q)
            *pBuf++=*pb++;
    }
    if(pb==q)
    {
        while(pa!=r)
            *pBuf++=*pa++;
    }
    for(pBuf=buf,pa=p;pBuf<buf+size && pa<q;pBuf++)    //将pBuf里面的所有内容复制到[p,q)中
        *pa++=*pBuf;
    free(buf);
    return ;
}

#if 0
void merge_sort(int *p,int *q)
{
    if((q-p)==1)
        return;
    int *r=p+(q-p)/2;
    merge_sort(p,r);
    merge_sort(r,q);
    order_sort(p,r,q);
}
#endif
#if 1
void merge_sort(int *p,int len)
{
    int *q=p+len;
    if((q-p)==1)
        return;
    int *r=p+len/2;
    merge_sort(p,r-p);
    merge_sort(r,q-r);
    order_sort(p,r,q);
}
#endif
int main()
{
    printf("please input 5 numbers:\n");
    int num[5];
    int i;
    for(i=0;i<5;i++)
        scanf("%d",num+i);            //need to change
    printf("\nthe numbers are:\n");
    for(i=0;i<5;i++)
        printf("%d ",num[i]);            //need to change
    printf("\n");
    merge_sort(num,5);
//    merge_sort(num,num+5);
    printf("afer sort the numbers are:\n");
    for(i=0;i<5;i++)
        printf("%d ",num[i]);            //need to change
    printf("\n");  
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值