基数排序是非比较排序算法,算法的时间复杂度是O(n). 相比于快速排序的O(nlgn),从表面上看具有不小的优势.但事实上可能有些出入,因为基数排序的n可能具有比较大的系数K.因此在具体的应用中,应首先对这个排序函数的效率进行评估.
基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次稳定排序,例如计数排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.
Radix_Sort( A, n)
{
temp[n][n] ←0
order[n]←0
//假设total是数组A中最大数的位数
m←1
while(m<=total)
{
for(j←0; i<n; i++)
{
lsd ←(order[i]/pow(10,j) )%10
temp[lsd][order[lsd]]←A[i]
order[lsd]←order[lsd]+1
}
//数组A[]重新排序
k←0
for(i←0; i<10;i++)
{
if(order[i]!=0)
{
for(j←0;j<order[i];j++,k++)
A[k] ← temp[i][j]
}
order[i]←0
}
m←m+1
}
}
假设有数组A[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}
附带代码如下:
/**---------------------------------------
houyong
------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
void radixSort(int[]);
int main(void) {
int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
printf("\n排序前: ");
int i;
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
putchar('\n');
radixSort(data);
printf("\n排序後: ");
for(i = 0; i < 10; i++)
printf("%d ", data[i]);
printf("\n\n");
return 0;
}
void radixSort(int data[])
{
int temp[10][10] = {0};
int order[10] = {0};
int n = 1;
while(n <= 10)
{
int i;
for(i = 0; i < 10; i++)
{
int lsd = ((data[i] / n) % 10);
temp[lsd][order[lsd]] = data[i];
order[lsd]++;
}
// 重新排列
int k = 0;
for(i = 0; i < 10; i++)
{
if(order[i] != 0)
{
int j;
for(j = 0; j < order[i]; j++, k++)
{
data[k] = temp[i][j];
}
}
order[i] = 0;
}
n *= 10;
}
}
/**
排序前: 73 22 93 43 55 14 28 65 39 81
排序後: 14 22 28 39 43 55 65 73 81 93
*/