マージソート

分割した要素を結合するときにはすでにミクロな集合内ではソートされていることが保証されているため線形時間で結合できる。というかんじ。

// merge_sort.c
#include "merge_sort.h"

void merge_sort(int *array, size_t size)
{
    int div = (int)size/2, *left = array, *right = &array[size - div - (size%2)];
    int result[size], i = 0, left_i = 0, right_i = 0;


    if (size > 1) {
        merge_sort(left, div);

        merge_sort(right, size - div);

        while(i < size) {

            if (right_i >= size - div) {
                result[i] = left[left_i];
                left_i++;
            }
            else if (left_i >= div) {
                result[i] = right[right_i];
                right_i++;
            }
            else {
                if (left[left_i] < right[right_i]) {
                    result[i] = left[left_i];
                    left_i++;
                }
                else {
                    result[i] = right[right_i];
                    right_i++;
                }
            }
            i++;
        }

        memcpy(array, result, sizeof(result));
    }
}

void print_r(const int list[], const size_t size)
{
    int i = 0;
    while(i < size) {
        printf("[%d] %d -> ", i, list[i]);
        i++;
    }
    printf("end \n");
}
// merge_sort.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void merge_sort(int *, size_t);
void print_r(const int [], const size_t);
// msort_test.c
#include "merge_sort.h"

int main()
{
    int test1[] = {5, 2, 3, 4, 8, 9, 7, 10, 2};

    print_r(test1, sizeof(test1)/sizeof(test1[0]));

    merge_sort(test1, sizeof(test1)/sizeof(test1[0]));

    print_r(test1, sizeof(test1)/sizeof(test1[0]));

    return 0;
}
[0] 5 -> [1] 2 -> [2] 3 -> [3] 4 -> [4] 8 -> [5] 9 -> [6] 7 -> [7] 10 -> [8] 2 -> end 
[0] 2 -> [1] 2 -> [2] 3 -> [3] 4 -> [4] 5 -> [5] 7 -> [6] 8 -> [7] 9 -> [8] 10 -> end