基数排序
#include <stdio.h> #include <stdlib.h> int n; //元素个数 int bit_num; //最大数字位数 /* * 获取相应位置上的数(从右到左) */ int GetNumInPos(int num, int pos) { int i, temp = 1; for (i = 0; i < pos - 1; i++) { temp *= 10; } return (num / temp) % 10; } /* * 基数排序(LSD) */ void RadixSort(int *array) { int radix = 10; int *count, *bucket, i, j, k; count = (int*) malloc(sizeof(int) * radix); bucket = (int*) malloc(sizeof(int) * n); for (k = 1; k <= bit_num; k++) { for (i = 0; i < radix; i++) { count[i] = 0; } //统计各个桶中所盛数据个数 for (i = 0; i < n; i++) { count[GetNumInPos(array[i], k)]++; } //count[i]表示第i个桶的右边界索引 for (i = 1; i < radix; i++) { count[i] = count[i] + count[i - 1]; } //分配 for (i = n - 1; i >= 0; i--) { j = GetNumInPos(array[i], k); bucket[count[j] - 1] = array[i]; count[j]--; } //收集 for (i = 0, j = 0; i < n; i++, j++) { array[i] = bucket[j]; } } } int main() { int i; int *array; printf("请输入最大数字的位数:"); scanf("%d", &bit_num); printf("请输入数组的大小:"); scanf("%d", &n); array = (int*) malloc(sizeof(int) * n); printf("请输入数据(用空格分隔):"); for (i = 0; i < n; i++) { scanf("%d", &array[i]); } RadixSort(array); printf("排序后为:"); for (i = 0; i < n; i++) { printf("%d ", array[i]); } printf("\n"); }