fork download
#include <stdio.h>
#include <stdlib.h>

int compare(const void *k1, const void *k2)
{
	int *a = (int*)k1;
	int *b = (int*)k2;
	if(*a > *b) return 1;
	if(*a == *b) return 0;
	if(*a < *b) return -1;
}

int mergesort(void *data, int count, int esize, 
	int (*compare)(const void *key1, const void *key2))
{
	void *tmp = malloc(count * esize);

	if (mgsort(data, tmp, esize, 0, count - 1, compare) < -1){
		free(tmp);
		return -1;
	}

	free(tmp);
	return 0;

}

int merge(void *data, void *tmp, int esize, int left, int right, int rightend, 
	int (*compare)(const void *key1, const void *key2))
{
	int l = left;
	int leftend = right - 1;
	int num = rightend - left + 1;
	int tmp_pos = left;
	
	while (left <= leftend && right <= rightend){
		if (compare(&data[left * esize], &data[right * esize]) < 0)
			memcpy(&tmp[(tmp_pos++) * esize], &data[(left++) * esize],esize);
		else
			memcpy(&tmp[(tmp_pos++) * esize], &data[(right++) * esize],esize);
	}
	while (left <= leftend)
		memcpy(&tmp[(tmp_pos++) * esize], &data[(left++) * esize],esize);
	while (right <= rightend)
		memcpy(&tmp[(tmp_pos++) * esize], &data[(right++) * esize],esize);
		
	memcpy(&data[l * esize], &tmp[l *esize], num*esize);
	return 0;

}

int mgsort(void *data, void *tmp, int esize, int left, int rightend, 
	int (*compare)(const void *key1, const void *key2))
{
	int center;

	if (left < rightend){
		center = (left + rightend) / 2;
		if (mgsort(data, tmp, esize, left, center, compare) < 0)
			return -1;
		if (mgsort(data, tmp, esize, center + 1, rightend, compare) < 0)
			return -1;
		if (merge(data, tmp, esize, left, center + 1, rightend, compare) < 0)
			return -1;
	}
	return 0;
}
int main(void) {
	int data[8] = {82,70,11,72,25,36,44,10};
	int i;
	int (*comp)(const void k1, const void k2) = &compare;
	mergesort(data,8,sizeof(int),comp);
	
	for(i=0;i<8;i++)
		printf("%d\n",data[i]);
	return 0;
}
Success #stdin #stdout 0s 2300KB
stdin
Standard input is empty
stdout
10
11
25
36
44
70
72
82