/*
//implement recursively
int mgSort( const void *data, int size, int esize, int i, int k, int (*comp) (const void *a, const void *b) );
//merge 2 sequential part
static int merge( const void *data, int esize, int i, int j, int k, int (*comp)(const void *a, const void *b) );
*/
static int merge(void *data, int esize, int i, int j, int k, int (*pComp)(const void *key1, const void *key2))
{
char *a = (char *)data;
char *m;
int ipos, jpos, mpos;
ipos = i;
jpos = j+1;
mpos = 0;
if( (m = (char *)malloc(esize*(k-i+1))) == NULL)
return -1;
while(ipos<=j || jpos<=k)
{
if(ipos > j)
{
while(jpos <= k)
{
memcpy(&m[mpos*esize], &a[jpos*esize], esize);
jpos++;
mpos++;
}
break;
}
if(jpos > k)
{
while(ipos <= j)
{
memcpy(&m[mpos*esize], &a[ipos*esize], esize);
ipos++;
mpos++;
}
break;
}
if( pComp(&a[ipos*esize], &a[jpos*esize]) < 0 )
{
memcpy(&m[mpos*esize], &a[ipos*esize], esize);
ipos++;
mpos++;
}
else
{
memcpy(&m[mpos*esize], &a[jpos*esize], esize);
jpos++;
mpos++;
}
}
memcpy(&a[i*esize], m, esize*(k-i+1));
free(m);
return 0;
}
int mgSort(void *data, int size, int esize, int i, int k, int (*pComp)(const void *key1, const void *key2))
{
int j;
if(i<k)
{
j = i + (k-i)/2;
if( mgSort(data, size, esize, i, j, pComp) < 0 )
return -1;
if( mgSort(data, size, esize, j+1, k, pComp) < 0)
return -1;
if( merge(data, esize, i, j, k, pComp) < 0)
return -1;
}
return 0;
}
/*
test by int array
*/
int myCompare(const void *key1, const void *key2)
{
int k1 = *((int *)key1);
int k2 = *((int *)key2);
if(k1 == k2)
return 0;
else
return (k1<k2) ? -1 : 1;
}
int main(int argc, char* argv[])
{
int i;
int test[] = {9, 8, 7, 1, 2, 3, 6, 4, 5, 10, 0};
int num = sizeof(test) / sizeof(int);
for(i=0; i<num; ++i)
{
cout<<" "<<test[i];
}
cout<<endl;
mgSort(test, num, sizeof(int), 0, num-1, myCompare);
for(i=0; i<num; ++i)
{
cout<<" "<<test[i];
}
cout<<endl;
//printf("Hello World!\n");
return 0;
}