/*追加下一个有序元素到合并集中*/
if(compare(&a[ipos * esize],*a[jpos *esize])<0)
{
memcpy(&m[mpos * esize],&a[ipos * esize],esize);
ipos++;
mpos++;
}
else
{
memccpy(&m[mpos * esize],&a[jpos * esize],esize);
jpos++;
mpos++;
}
}
/*将已经排序的数据集拷贝到原数组中*/
memcpy(&a[i * esize],m,esize * ((k-i)+1));
/*释放为排序分配的存储空间*/
free(m);
return 0;
}
/*mgsort 归并排序(递归调用)*/
int mgsort(void *data, int size, int esize, int i, int k, int(*compare)(const void *key1,const void *key2))
{
int j;
/*递归调用mgsort持续分割,直到没有可以再分割的数据集*/
if(i < k)
{
/*计算对半分割的位置下标*/
j = (int)(((i+k-1)) / 2);
/*递归排序两边的集合*/
if(mgsort(data, size, esize, i, j, compare) < 0)
return -1;
if(mgsort(data, size, esize, j+1, k, compare) <0)
return -1;
/*将两个有序数据集合并成一个有序数据集*/
if(meger(data, esize, i, j, k compare) < 0)
return -1;
}
return 0;
}