基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
解法:
比如有一串数字:32 41 55 12 62 63 21 89 24 74
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
桶编号0到9:
0
1 41 21
2 32 12 62
3 63
4 24 74
5 55
6
7
8
9 89
然后:接下来将这些桶子中的数值重新串接起来,成为以下的数列:
41 21 32 12 62 63 24 74 55 89
最后:按照十位数进行分配
0
1 12
2 21 24
3 32
4 41
5 55
6 62
7 74
8 89
把数字串接后:
12 21 24 32 41 55 62 74 89排序完成
c代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int get_max_inarr(int *,int); //获取一个数组中的最大数
int get_max_bit(int); //或者一个人数的位数
void sort(int *,int ); //基数排序
int main()
{
int arr[] = { 81, 22, 73, 93, 43, 14, 55, 65, 28, 39 };
int size = sizeof(arr) / sizeof(int);
//int num=get_max_inarr(arr, 10);
//printf("%d", get_max_bit(num));
sort(arr,10);
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
void sort(int *arr, int n)
{
int data[10];
int table[10][10] = {};
int i, j;
int max_arr = get_max_inarr(arr,n);
int max_bit = get_max_bit(max_arr);
for (i = 0; i <= max_bit; i++) //个,十,百...排序
{
for (int a = 0; a < n;a++) // 遍历数组
{
//634 (634/1)%10 个位4
//(634/10)%10 十位3
//(634/100)%10 百位6
int temp = (*(arr + a) / int(pow(10, i))) % 10;
for (j = 0; j < 10; j++)
{
if (table[temp][j] == NULL)
{
table[temp][j] = *(arr + a);//放入桶中
break;
}
}
}
int k = 0;
for (int m = 0; m < n; m++)
{
for (int l = 0; l < 10; l++)
{
if (table[m][l] != NULL)
{
arr[k++] = table[m][l]; //将桶中数进行串接
table[m][l] = NULL; //清空,进行下个高位数的分配
}
}
}
}
}
int get_max_inarr(int *arr,int n)
{
int max = 0;
for(int i=1; i < n; i++)
{
if (arr[max] < arr[i])
{
int temp = arr[max];
arr[max] = arr[i];
arr[i] = temp;
}
}
return arr[max];
}
int get_max_bit(int num)
{
int count = 0;
int tmep = num / 10;
while (tmep != 0)
{
count++;
tmep = tmep / 10;
}
return count;
}