This code seems to switch the last two of the array..
Code:
for (int i = 1; i < (int)num; ++i) {
int j = i;
void *element = (char *)arg + j * size;
void *tmp_address = malloc (sizeof (arg));
for (; j > 0; --j) {
int cmp = cmpfnc (element, (char *)arg + (j - 1) * size);
if (cmp > 0) break;
memcpy (tmp_address, element, size);
memcpy (element, (char *)arg + (j - 1) * size, size);
memcpy ((char *)arg + (j - 1) * size, tmp_address, size);
}
memcpy (tmp_address, (char *)arg + j * size, size);
memcpy ((char *)arg + j * size, element, size);
memcpy (element, tmp_address, size);
}