基数排序 后缀数组 倍增数组
(https://www.cnblogs.com/jinkun113/p/4743694.html参考)
基数排序(Radix Sort)
一种按位顺次比较排序的方法,即从个,十,百依次比较的方法,称为LSD(或者从最高位开始,称为MSD)。又称“桶子法”。
例:有数{73, 22, 93, 8, 55, 14, 28, 65, 39, 81}
则按“桶”分类,先从个位:
0 ——
1 —— 81
2 —— 22
3 —— 73 93 (顺序不能变,按原数列的顺序)
4 —— 14
5 —— 55 65
6 ——
7 ——
8 —— 8 28
9 —— 39
排好后,依次从桶中取出,{81, 22, 73, 93,14, 55, 65, 28, 8, 39}。
再按十位分类:
0 —— 8
1 —— 14
2 —— 22 28
3 —— 39
4 —— 43
5 —— 55
6 —— 65
7 —— 73
8 —— 81
9 —— 93
再取出,至此排序完毕。{8 ,14, 22, 28, 39, 55, 65, 73, 81, 93}
- 当位数较高时,用MSD效率较高。
代码实现:
int Max(int *arr,int len)
{
// find max num
int max=*arr;
for(int i=i;i<len;i++){
if(max<*(arr+i))max=*(arr+i);
}
//找到最大位数m
int m=0;
while( (max/pow(10,i))%10 ){ //pow(float x,float y)返回x的y次方,同时注意此处取每个位上的数的方法
m++;
i++;
}
return m;
}
int *RadixSort(int *arr,int len,int k ){
int bucket[10][n]; //n是每个基数对应篮子可以装的数字个数,自定
for(int i=0;i<len;i++){
int radix=(*(arr+i)/pow(10,k))%10;
for(int j=0;j<10;j++){
if(radix==j){//找到对应基数
for(int r=0;r<n;r++){
if(bucket[j][r]!=NULL)bucket[j][r]=*(arr+i);//放进去
}
}
}
}
int n=0;//把值放回数组
for(int i=0;i<10;i++){
for(int j=0;bucket[i][j]!=NULL;j++){
*(arr+n)=bucket[i][j];
n++;
}
}
}
int main(){
int arr[];
scanf();
int len=sizeof(arr)/sizeof(int);
int m=Max(arr);
for(int i=0;i<m;i++){
RadixSort(arr,len,i)//依次对每个位排序
}
printf();
return 0;
}
未完待续