merge_sort
void merge(int* tab, int first, int middle, int last)
{
int left_size = middle - first + 1;
int right_size = last - middle;
int tmp_left[left_size];
int tmp_right[right_size];
int i, j, k;
for (i = 0; i < left_size; i += 1) {
tmp_left[i] = tab[first + i];
}
for (i = 0; i < right_size; i += 1) {
tmp_right[i] = tab[middle + 1 + i];
}
for (i = 0, j = 0, k = first; i < left_size && j < right_size; k += 1) {
if (tmp_left[i] <= tmp_right[j]) {
tab[k] = tmp_left[i];
i += 1;
} else {
tab[k] = tmp_right[j];
j += 1;
}
}
while (i < left_size) {
tab[k++] = tmp_left[i++];
}
while (j < right_size) {
tab[k++] = tmp_right[j++];
}
}
void merge_sort(int* tab, int first, int last)
{
int middle;
if (last > first) {
middle = first + (last - first) / 2;
merge_sort(tab, first, middle);
merge_sort(tab, middle + 1, last);
merge(tab, first, middle, last);
}
}