IAMISSAM
11/13/2018 - 9:35 PM

merge_sort

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);
    }
}