diff --git a/sort.c b/sort.c index 938780d..9787cb9 100644 --- a/sort.c +++ b/sort.c @@ -83,34 +83,33 @@ _merge(int *tmp, int *a, int *b, int *end) * Функция для слияния двух отсортированных массивов в один. */ - int *pa = a; // указатель на первый массив - int *pb = b; // указатель на второй массив - int *pt = tmp; // указатель на временный массив - int *end1 = b; // конец первого массива - int *end2 = end; // конец второго массива - - while (pa < end1 && pb < end2) { - if (*pa <= *pb) { - *pt++ = *pa++; - } else { - *pt++ = *pb++; + int a1 = 0, b1 = 0, tmp1 = 0; + int ra = b - a, rb = end - b; + while (ra > a1 && rb > b1) + { + if (a[a1] < b[b1]) + { + tmp[tmp1++] = a[a1++]; + } + else + { + tmp[tmp1++] = b[b1++]; + } + } + while (ra != a1) + { + tmp[tmp1] = a[a1]; + a1++; + tmp1++; + } + while (rb != b1) + { + tmp[tmp1] = b[b1]; + b1++; + tmp1++; } - } - - while (pa < end1) { - *pt++ = *pa++; - } - - while (pb < end2) { - *pt++ = *pb++; - } - - for (pt = tmp; a < end; ) { - *a++ = *pt++; - } } - static void _merge_sort_int(int *tmp, int *arr, size_t n) {