算法复习之基数排序

来源:互联网 发布:33周胎儿正常b超数据 编辑:程序博客网 时间:2024/06/03 15:01

LSD:从低位排序逐步至高位排序,此处的低位指的是从个位->十位->百位….
代码如下:

//获取数据d位的值int getDigit(int x,int d){    int value = 1 ;    for(int i = 0 ;i <d-1;++i)        value *= 10 ;    return (x/value)%10;}//LSD 算法void lsdRadixSort(int *arr,int begin,int high,int d){    int i,j ;    const int radix = 10 ;    int count[radix] ={0} ;    int *bucket = (int*)malloc(end-begin+1)*sizeof(int));    for(int k = 1;k<=d;++k)    {        //计算每个桶中的元素个数        for(i = begin;i<=end;++i)            ++count[getDigit(arr[i],d)] ;        //        for(i = 1;i<radix;++i)            count[i]+=count[i-1];        //装入元素        for(i = end;i>=begin;--i)        {            j = getDigit(arr[i],d);            bucket[count[j]-1] = arr[i] ;            --count[j];        }        //将d位排序完的数据拷贝至arr中        for(i = begin,j=0;i<=end;++i,++j)            arr[i] = bucket[j] ;    }}//MSD算法 从高位排序至低位排序void msdRadixSort(int *arr,int begin,int end,int d){    const int radix = 10 ;    int i,j ;    int *bucket = (int*)malloc((end-begin+1)*sizeof(int));    //求出d位中各个桶的元素个数,即分段d位分别为0-9的个数    for(i = begin;i<=end;++i)    {        ++count[getDigit(arr[i],d)];    }    //求出各个桶的边界索引0-9中每一个段的元素个数    for(i = 1;i<radix;++i)        count[i] += count[i-1] ;    //装入桶中    for(i = end;i>=begin;--i)    {        j = getDigit(arr[i],d) ;        bucket[count[j]-1] = arr[i] ;        --count[j];    }    //从桶中收集数据    for(i= begin,j = 0  ;i<=end;++i,++j)        arr[i] = bucket[j] ;    for(i = 0 ;i<radix;++i)    {        int low = begin + count[i] ;        int high = begin + count[i+1];        if(low < high && d>1)            msdRadix(arr,low,high);    }
0 0
原创粉丝点击