← index
insertion-sort.c
Source: C2x.Examples/src/insertion-sort.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void insertion_sort(void *base, size_t count, size_t size,
                    int (*cmp)(const void *, const void *)) {
    unsigned char *arr = base;
    unsigned char *temp = malloc(size);
    if (temp == nullptr)
        return;

    for (size_t i = 1; i < count; ++i) {
        memcpy(temp, arr + i * size, size);
        size_t j = i;
        while (j > 0 && cmp(arr + (j - 1) * size, temp) > 0) {
            memcpy(arr + j * size, arr + (j - 1) * size, size);
            --j;
        }
        memcpy(arr + j * size, temp, size);
    }
    free(temp);
}

int compare_integer(const void *a, const void *b) {
    const int *x = a;
    const int *y = b;
    if (*x < *y)
        return -1;
    if (*x > *y)
        return 1;
    return 0;
}

int main(void) {
    size_t number = 0;
    size_t allocated = 1024 * 4;
    int *values = malloc(sizeof(int) * allocated);
    if (values == nullptr) {
        fprintf(stderr, "Error could not allocate memory.\n");
        return EXIT_FAILURE;
    }
    int val = 0;
    while ((fscanf(stdin, "%d", &val)) == 1) {
        if (number >= allocated) {
            allocated *= 2;
            int *temp = realloc(values, sizeof(int) * allocated);
            if (temp == nullptr) {
                fprintf(stderr, "Error on allocation of memory.\n");
                free(values);
                return EXIT_FAILURE;
            }
            values = temp;
        }
        values[number++] = val;
    }
    insertion_sort(values, number, sizeof(int), compare_integer);
    for (size_t i = 0; i < number; ++i)

        printf("%d\n", values[i]);
    free(values);
    return EXIT_SUCCESS;
}