#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);
//}