← index
countsort/count.c
Source: C2x.Examples/src/countsort/count.c
#include "count.h"
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool count_sort(int *data, int size, int k) {
    if (data == nullptr || size == 0 || k == 0)
        return false;
    int *count, *temp;
    count = malloc((size_t)k * sizeof(int));
    if (count == nullptr)
        return false;
    temp = malloc((size_t)size * sizeof(int));
    if (temp == nullptr) {
        free(count);
        return false;
    }
    for (int i = 0; i < k; ++i)
        count[i] = 0;
    for (int z = 0; z < size; ++z)
        count[data[z]] = count[data[z]] + 1;
    for (int i = 1; i < k; ++i)
        count[i] = count[i] + count[i - 1];
    for (int z = size - 1; z >= 0; z--) {
        temp[count[data[z]] - 1] = data[z];
        count[data[z]] = count[data[z]] - 1;
    }
    memcpy(data, temp, (size_t)size * sizeof(int));
    free(count);
    free(temp);
    return true;
}