基数排序
这是一种和前述算法完全不同的排序方法。前述算法都要进行关键字的比较,而基数排序不需要进行记录关键字之间的比较。
链式基数排序
思想:从低位到高位一次对待排序的关键码进行分配和收集,经过d趟分配和收集,就可以得到一个有序序列。
1.若关键字是十进制整数,则按个、十、百等位进行分解,基数rd=10,C0=0,C9=9,d为最长整数的位数。
2.若关键字是小写的英文字,则rd=26,C0=‘a’,C25=‘z’,d为字符串的最大长度。
java代码:
public class RadixSort {
public static void main(String[] args) {
int array[] ={3,22,93,3,5,14,28,65,39,81,71,72,48,39,55,105,129,184,196,208};
showArray(array);
System.out.println("\n排序后");
radixSort(array,array.length);
showArray(array);
}
private static void radixSort(int[] a,int size) {
int[][] temp=new int[10][20]; //第一个10表示0~9,第二个20表示a的size
int[] order=new int[10];
int i,j,k; //k表示当前比较的那一位上的具体数字
int n; //n=1,10,100,1000...取决于a中的最大的数
int p;
n=1;
while(n <= 100)
{
for(i=0;i<size;i++)
{
k = (a[i]/n) % 10;
temp[k][order[k]] = a[i];
order[k]++;
}
p=0; //p为一次排序过程中,a的脚标
for(i=0;i<10;i++)
{
if(order[i] != 0)
{
for(j=0;j<order[i];j++)
{
a[p] = temp[i][j];
p++;
}
order[i] = 0;
}
}
n *= 10;
}
}
private static void showArray(int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
c代码:
//基数排序
#include<stdio.h>
void radixSort(int *a,int size)
{
int temp[10][20]={0}; //第一个10表示0~9,第二个20表示a的size
int order[10]={0};
int i,j,k; //k表示当前比较的那一位上的具体数字
int n; //n=1,10,100,1000...取决于a中的最大的数
int p;
n=1;
while(n <= 100)
{
for(i=0;i<size;i++)
{
k = (a[i]/n) % 10;
temp[k][order[k]] = a[i];
order[k]++;
}
p=0; //p为一次排序过程中,a的脚标
for(i=0;i<10;i++)
{
if(order[i] != 0)
{
for(j=0;j<order[i];j++)
{
a[p] = temp[i][j];
p++;
}
order[i] = 0;
}
}
n *= 10;
}
}
int main()
{
int a[20]={3,22,93,3,5,14,28,65,39,81,71,72,48,39,55,105,129,184,196,208};
int i;
radixSort(a,20);
for(i=0;i<20;i++)
printf("%d ",a[i]);
return 0;
}