基数排序

#include <stdio.h>

const int pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};

#define get_digit(num, n) ((num) % pow10[(n)] / pow10[(n) - 1])

int counting_sort(const int arr[], int size, int target[], int n) {
    int count[10] = {0};
    for (int i = 0; i < size; ++i) {
        count[get_digit(arr[i], n)]++;
    }
    if (count[0] == size) {
        return 0;
    }
    for (int i = 1; i < 10; ++i) {
        count[i] += count[i - 1];
    }
    for (int i = size - 1; i >= 0; --i) {
        target[count[get_digit(arr[i], n)] - 1] = arr[i];
        count[get_digit(arr[i], n)]--;
    }
    return 1;
}

void radix_sort(int arr[], int size) {
    int another[size], state = 1, i;
    for (i = 1; state > 0 && i <= 10; ++i) {
        if (i % 2 > 0) {
            state = counting_sort(arr, size, another, i);
        } else {
            state = counting_sort(another, size, arr, i);
        }
    }
    if (i % 2 > 0 && i <= 10) {
        for (int j = 0; j < size; ++j) {
            arr[j] = another[j];
        }
    }
}

int main() {
    int arr[] = {329, 457, 657, 839, 436, 720, 355}, size = sizeof(arr) / sizeof(int);
    radix_sort(arr, size);
    for (int i = 0; i < size; ++i) {
        printf("%d\n", arr[i]);
    }
    return 0;
}

 

posted @ 2022-07-03 02:52  张时雨  阅读(23)  评论(0)    收藏  举报