基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
基数排序将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
例如:64,8,216,512,27,729,0,1,343,125
第一步:按照最低位优先进行排序
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 |512|343| 64|125|216| 27| 8 |729|
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
第二步:按照次最低位优先进行第二趟排序
|---|---|---|---|---|---|---|---|---|---|
| 8 | |729| | | | | | | |
| 1 |216| 27| | | | | | | |
| 0 |512|125| |343| | 64| | | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
第三步:按最高位进行排序
|---|---|---|---|---|---|---|---|---|---|
| 64| | | | | | | | | |
| 27| | | | | | | | | |
| 8 | | | | | | | | | |
| 1 | | | | | | | | | |
| 0 |125|216|343| |512| |729| | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
最后得到的结果是0,1,8,27,64,125,216,343,512,729
需要注意的是如果两个数出自同一个桶但顺序是错误的
实现
#include<stdio.h>
#define MAX 20
#define BASE 10
void print(int *a,int n)
{
int i;
for( i = 0; i < n; i++)
printf("%d ",a[i]);
}
void radixsort(int *a,int n)
{
int i,b[MAX],m = a[0],exp = 1;
for (i = 1; i < n; i++)
{
if(a[i] > m)
m = a[i];
}
while ( m / exp > 0)
{
int bucket[BASE] = { 0 };
for ( i = 0; i < n; i++)
bucket[(a[i] / exp) % BASE]++;
for ( i = 1; i < BASE; i++)
bucket[i] += bucket[i - 1];
for ( i = n - 1; i >= 0; i--)
b[--bucket[(a[i] / exp ) % BASE]] = a[i];
for ( i = 0; i < n; i++)
a[i] = b[i];
exp *= BASE;
#ifdef SHOWPASS
printf("
PASS :");
print(a,n);
#endif
}
}
int main()
{
int arr[MAX];
int i,n;
scanf("%d",&n);
n = n < MAX?n:MAX;
for(i = 0; i < n; i++)
scanf("%d",&arr[i]);
radixsort(&arr[0],n);
print(&arr[0],n);
return 0;
}