summaryrefslogtreecommitdiff
path: root/src/03/sort.c
blob: 497d2abb332811c48453113cf6756798c01ab1a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>

void _merge(int *items, int min, int pivot, int max)
{
  if (items[min] > items[pivot]) {
    int length = (max-min) + 1;
    int tmp[length];

    for (int i = pivot; i <= max; i++)
      tmp[i - pivot] = items[i];

    for (int i = min; i < pivot; i++)
      tmp[i + pivot - min] = items[i];

    for (int i = 0; i < length; i++)
      items[min+i] = tmp[i];
  }
}

void _merge_sort(int *items, int min, int max)
{
  if (!items || max == min)
    return;

  int pivot = (min + max) / 2;
  _merge_sort(items, min, pivot);
  _merge_sort(items, pivot + 1, max);
  _merge(items, min, pivot + 1, max);
}

void merge_sort(int *items, int length) {
  if (!items || length <= 0)
    return;

  _merge_sort(items, 0, length - 1);
}