1. 程式人生 > >基數排序 字尾陣列 倍增陣列

基數排序 字尾陣列 倍增陣列

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

未完待續