基数排序

基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
基数排序将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

例如: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;
}
原文地址:https://www.cnblogs.com/y3w3l/p/6349775.html