算法

#include "merge.h"
#include <string.h>
#include <stdlib.h>
void merge(void *a, int size, int p, int q, int r,int(*comp)(void *,void *)){
   int i, j, k, n1=q-p+1, n2=r-q;
   void *L=(void*)malloc(n1*size);
   void *R=(void*)malloc(n2*size);
   memcpy(L,(char*)a+p*size,n1*size);/*将a[p..q]拷贝到L[1..n1]*/
   memcpy(R,(char*)a+(q+1)*size,n2*size);/*将a[q+1..r]拷贝到R[1..n2]*/
   i=j=0;
   k=p;
   while(i<n1&&j<n2)
       if(comp((char*)L+i*size,(char*)R+j*size)<0)/*L[i]<R[j]*/
           memcpy((char*)a+(k++)*size,(char*)L+(i++)*size,size);/*a[k]←L[i]*/
       else
           memcpy((char*)a+(k++)*size,(char*)R+(j++)*size,size);/*a[k] ←R[j]*/
   if(i<n1)
       memcpy((char*)a+k*size,(char*)L+i*size,(n1-i)*size);/*将L[i..n1]拷贝到a[k..r]*/
   if(j<n2)
       memcpy((char*)a+k*size,(char*)R+j*size,(n2-j)*size);/*将R[j..n2]拷贝到a[k..r]*/
   free(L);L=NULL;
   free(R);R=NULL;

}


#include "../Utility/merge.h"
void mergeSort(void *a,int size,int p,int r,int(*comp)(void *,void *)){
     if(p<r){
         int q=(p+r)/2;
         mergeSort(a,size,p,q,comp);
         mergeSort(a,size,q+1,r,comp);
         merge(a,size,p,q,r,comp);
     }
}


//#include "../Utility/merge.h"
//int main(int argc, char** argv) {
//    int a[]={1,2,5,8,9,0,3,4,6,7},i;
//    char *b[]={"AoMen","BeiJing","ShangHai","ChongQing","TianJin","XiangGang"};
//    double c[]={0.5,3.7,6.3,8.5,9.2,1.7,2.3,4.1,5.9,7.4};
//    merge(a,sizeof(int),0,4,9,intGreater);
//    for(i=0;i<10;i++)
//        printf("%d ",a[i]);
//    printf("\n");
//    merge(b,sizeof(char *),0,2,5,strGreater);
//    for(i=0;i<6;i++)
//        printf("%s ",b[i]);
//    printf("\n");
//    merge(c,sizeof(double),0,4,9,doubleGreater);
//    for(i=0;i<10;i++)
//        printf("%1.1f ",c[i]);
//    printf("\n");
//    return (EXIT_SUCCESS);
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值