typedef int (* Compare)(const void *key1, const void *key2);
static int Merge(void *sort, unsigned int eleSize, int left, int midle, int right, Compare compare)
{
int ipos = left;
int jpos = midle + 1;
int mpos = 0;
char *data = (char *)sort;
char *result = malloc(eleSize * (right - left + 1));
if (result == NULL) {
return -1;
}
while ((ipos <= midle) || (jpos <= right)) {
if (ipos > midle) {
while (jpos <= right) {
memcpy(&result[mpos * eleSize], &data[jpos * eleSize], eleSize);
jpos++;
mpos++;
}
continue;
} else if (jpos > right) {
while (ipos <= midle) {
memcpy(&result[mpos * eleSize], &data[ipos * eleSize], eleSize);
ipos++;
mpos++;
}
continue;
}
if (compare(&data[ipos * eleSize], &data[jpos * eleSize]) < 0) {
memcpy(&result[mpos * eleSize], &data[ipos * eleSize], eleSize);
ipos++;
mpos++;
} else {
memcpy(&result[mpos * eleSize], &data[jpos * eleSize], eleSize);
jpos++;
mpos++;
}
}
memcpy(&data[left * eleSize], result, eleSize * mpos);
free(result);
return 0;
}
static int MergeSort(void *sort, unsigned int eleSize, int left, int right, Compare compare)
{
int j;
if (left >= right) {
return 0;
}
j = (right - left) / 2 + left;
if (MergeSort(sort, eleSize, left, j, compare) != 0) {
return -1;
}
if (MergeSort(sort, eleSize, j + 1, right, compare) != 0) {
return -1;
}
return Merge(sort, eleSize, left, j, right, compare);
}
int MgSort(void *sort, unsigned int eleSize, int size, Compare compare)
{
if ((sort == NULL) || (eleSize == 0) || (size == 0) || (compare == NULL)) {
return -1;
}
return MergeSort(sort, eleSize, 0, size - 1, compare);
}