基数排序 后缀数组 倍增数组

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;
}

未完待续

猜你喜欢

转载自www.cnblogs.com/Bz1092467670/p/10060219.html