基数排序(Radix Sorting)之前的排序都是关键字相互比较和移动完成。
基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。
分为:①多关键字排序,②链式基数排序两种
①多关键字排序,还分为两种方法:一,最高位优先,二,最低位优先
下面是最低位优先的方法,个十百千,的顺序
初始 个位 -> 十位 -> 百位 ->千位
7467 6792 9134 9134 1239
1247 9134 1239 9187 1247
3275 3275 1247 1239 3275
6792 4675 7467 1247 4675
9187 7467 3275 3275 6792
9134 1247 4675 7467 7467
4675 9187 9187 4675 9134
1239 1239 6792 6792 9187
输入:一张有n个数的表L ={ a1,a2,...,an } 和k位数字
过程:准备10个空表L[10][N],枚举1-k位( j ),每次遍历数组a(下标 i ),数a[ i ] 在第 j 位上为m,放在L[ m ][0]增1(L[m][0]为该表里的数字个数),数a[ i ]插在L[ m ]后面,遍历完数组后,重新将L[10][N]里的数字按顺序重新放回a[]数组里,继续枚举 j
输出:按非降序排列的L。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=30;
void RadixSort(int *a,int k,int n){
int tm,m,p;
int L[10][N];//L[m][0]中存放为该表个数
for(int j=1;j<=k;j++){
for(int i=0;i<10;i++) L[i][0]=0;
for(int i=1; i<=n; i++){//取出数放到L里
tm=a[i];
for(int l=1;l<j;l++) tm/=10;
m=tm%10;
L[m][0]++; p=L[m][0];
L[m][p]=a[i];
}
/*
printf("---%d----\n",j);
for(int i=0;i<10;i++){
printf("%d: ",i);
for(int l=0;l<=L[i][0];l++){
printf("%d ",L[i][l]);
}
printf("\n");
}*/
tm=1;
for(int i=0;i<10;i++){
for(int j=1;j<=L[i][0];j++){
a[tm++]=L[i][j];
}
}
/*
for(int i=0;i<tm;i++){
printf("%d ",a[i]);
}printf("\n");
*/
}
}
int main()
{
int a[N]={0,7467,1247,3275,6792,9187,9134,4675,1239};
int len=8;
RadixSort(a,4,len);
for(int i=1;i<=len;i++){
printf("%d ",a[i]);
}
return 0;
}
②链式基数排序,
就是将上述程序中的表L[10][N] 变成十个链表,思想差不多,变成链表后,可以有效的节省空间。
就不会每个暂存表 浪费多余的长度。
基数排序到此结束。