基数排序
先把最大数找到,用来判断最高位。终止循环用的
然后把数字根据个、十、百等位上的数来判断放在哪个桶里面(并不是把数字放进桶里,只是把这个桶的数字加一,代表桶中有一个数,这样子你只要算前面有多少个数字,你就知道当前的数字是排在第几位了)
#include <stdio.h>
#include <stdlib.h>
//基数桶[0-9]
#define BASE 10
void radixsort(int *arr, int size){
int i;
int max = arr[0];
for (i = 1; i < size; i++){
if (max < arr[i])
max = arr[i];
}
//exp是用来取个、十、百等等位的数值的除数后面再对BASE取余
int exp = 1;
//临时数组
int *temp = (int*)malloc(sizeof(int)*size);
while (max / exp > 0){
//桶。这里有十个桶
int Bucket[BASE] = { 0 };
/**********************************************************
个位或更高的位上数字相同则桶记数加一
相当于把数字放入桶中占个位置,但不需要把值放进桶里。
第一次循环可能存在小数字在后面的情况。但是随着按位数入桶的位数越高,
他们的大小顺序也越准确。(这里位数最高的也只有两位)
当循环到最高位的位数对比时,所有的就基本都是有序的了。
************************************************************/
for (i = 0; i < size; i++){
++Bucket[(arr[i] / exp) % BASE];
}
/**********************************************************
记录每个桶里有多少个数,然后再把前面一个桶的数加到后面一个桶中。
这样后面的桶中的数字,就知道前面所有桶所装的数字有多少,
也就能推导自己是排在了哪个位置。
***********************************************************/
for (i = 1; i < BASE; i++){
Bucket[i] += Bucket[i - 1];
}
/**********************************************************
前面是从前往后存入数字,这里选择从后往前取数字。
(取桶中最后一个数字的话,只需要桶里的数减一,
就知道自己的排位。但是取前面的数字的话,就没这么方便了。)
***********************************************************/
for (i = size - 1; i >= 0; i--){
temp[--Bucket[(arr[i] / exp) % BASE] ]= arr[i];
}
//最后再把临时数组中按个位或更高位排好序的放回到arr数组中
for (i = 0; i < size; i++){
arr[i] = temp[i];
}
//进入下一个更高位的对比
exp *= BASE;
}
free(temp);
}
int main()
{
int arr[] = { 27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25 };
int size = sizeof(arr) / sizeof(int);
// soer
radixsort(arr, size);
//print
int i;
for (i = 0; i < size; ++i)
printf("%d ", arr[i]);
printf("\n");
return 0;
}