码迷,mamicode.com
首页 > 编程语言 > 详细

基数排序的msd实现c++

时间:2017-10-20 20:00:28      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:分配   实现   收集   相同   col   pac   www.   stream   扫描   

#include<iostream>
#include<cstdlib>
using namespace std;
int getdigit(int x,int d)
{
    int a[]={
        1,1,10
    };//因为待排序数组最大是两位数,所以到十位就好
    return ((x/a[d])%10);//确定桶号
}
void PrintArr(int ar[],int n)
{
    for(int i=0;i<n;i++)
        cout<<ar[i]<<" ";
    cout<<endl;
}
void msdradix_sort(int arr[],int begin,int end,int d)
{
    const int radix=10;
    int count[radix],i,j;
    //置空
    for(i=0;i<radix;++i)
    {
        count[i]=0;
    }
    //分配桶储存空间
    int *bucket=(int *)malloc((end-begin+1)*sizeof(int));
    //统计各桶需要装的元素数
    for(i=begin;i<=end;++i)
    {
        count[getdigit(arr[i],d)]++;
    }
    //求出桶的便捷索引,count[i]值为第i个桶的右边界索引+1
    for(i=01;i<radix;++i)
    {
        count[i]=count[i]+count[i-1];
    }
    //这里要从右向左扫描,保证排序的稳定性
    for(i=end;i>=begin;--i)
    {
        j=getdigit(arr[i],d);//求出关键码的第d位数字,如576的第三位是5
        bucket[count[j]-1]=arr[i];//放入对应的桶中,count[j]-1是第j个桶的右边界索引
        --count[j];
    }
    //此时count[i]为第i个桶的左边界
    //从每个桶中收集数据
    for(i=begin,j=0;i<=end;++i,++j)
    {
        arr[i]=bucket[j];
    }
    //释放储存空间
    free(bucket);
    //对每个桶中数据进行再排序
    for(i=0;i<radix;i++)
    {
        int p1=begin+count[i];//第i个桶的左边界
        int p2=begin+count[i+1]-1;//第i个桶的有边界
        if(p1<p2&&d>1)
        {
            msdradix_sort(arr,p1,p2,d-1);//对第i个桶递归调用,进行基数排序,数位降1
        }
    }
}
int main()
{
    int ar[]={  
        12,24,54,23,54,76,97,45,23,65,87,34,
    };
    int len=sizeof(ar)/sizeof(int);
    cout<<"排序前数据如下"<<endl;
    PrintArr(ar,len);
    msdradix_sort(ar,0,len-1,2);
    cout<<"排序后结果如下:"<<endl;
    PrintArr(ar,len);
}

 

最高位优先法通常是一个递归的过程:

<1>先根据最高位关键码K1排序,得到若干对象组,对象组中每个对象都有相同关键码K1。

<2>再分别对每组中对象根据关键码K2进行排序,按K2值的不同,再分成若干个更小的子组,每个子组中的对象具有相同的K1和K2值。

<3>依此重复,直到对关键码Kd完成排序为止。

<4> 最后,把所有子组中的对象依次连接起来,就得到一个有序的对象序列。

from[http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html]

基数排序的msd实现c++

标签:分配   实现   收集   相同   col   pac   www.   stream   扫描   

原文地址:http://www.cnblogs.com/enyala/p/7700880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!