| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 817 人关注过本帖
标题:发个刚写好的桶式排序的程序MSD
只看楼主 加入收藏
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
结帖率:100%
收藏
 问题点数:0 回复次数:0 
发个刚写好的桶式排序的程序MSD
////////////////////////////////////////////////////
//递归:RadixSort()公有成员函数
//采用MSD方法实现基数排序,left->right是排序的范围,
//d是表示采用第d位为基准进行排序
//算法的思想:利用优先级高的关键码i对序列进行分组,
//每个分组内都具有相同的关键码k,所有的关键码为k的元素
//都处于一个桶内,关键码k对应桶的大小放在BucketStart[k]
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::RadixSort(int left,int right,int d)
{
    /*递归结束的条件*/
    if(left>=right||d<=0)
        return;
    int L=right-left+1;             //得到当前待排序序列长度
    /*首先按照关键码的第d位进行桶的划分*/
    int count[10];                  //数组:用于存放十个阿拉伯数字对应的桶的大小
    for(int i=0;i<10;i++)           //把count[]数组全部初始化为0
        count[i]=0;
    for(i=0;i<L;i++)                //统计每个字符对应的桶的大小
    {
        int k=getDigit(Vector[i],d);//获取第i个元素的第d个排序码k
        count[k]++;                 //统计d位置上排序码为k的元素的个数
    };

    /*把count[]数组中数据转换成每个桶开始的位置*/
    int start=0;                    //每个桶的开始位置
    int len;                        //当前处理的前个桶的长度
    int Bucketstart[10];            //记录每个桶的开始位置
    for(i=0;i<10;i++)               
    {
        len=count[i];               //记录下当前桶的长度
        count[i]=start;             //数据的替换
        Bucketstart[i]=start;
        start=len+start;            //计算下个桶的开始位置
    };

    /*把Vector[]中的数据以桶序放入辅助数组Arr*/
    Element<T,E>* Arr=              //开辟辅助数组的存储空间
        new Element<T,E>[L];
    for(i=0;i<L;i++)
    {
        int k=getDigit(Vector[i],d);//取出要进行比较的关键码
        int pos=count[k];           //得到要插入元素在桶中的位置
        Arr[pos]=Vector[i];         //把元素插入其中
        count[k]++;
    };

    /*把辅助数组中的元素复制回原来的Vector[]中*/
    for(i=0;i<L;i++)
        Vector[i]=Arr[i];

    /*对每个桶(子序列)再进行递归排序*/
    for(i=0;i<10;i++)
    {
        int p1=Bucketstart[i];      //当前桶的开始位置
        int p2=count[i+1]-1;        //当前桶的结束位置
        RadixSort(p1,p2,d-1);
    };
};
/////////////////////////////RadixSort()公有函数结束

发觉这样的排序好象时间复杂消耗在getdigit()函数上比较多,虽然从表面
上看时间复杂度不错.
搜索更多相关主题的帖子: MSD 
2008-11-07 20:37
快速回复:发个刚写好的桶式排序的程序MSD
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032392 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved