您的位置:首页 > 其它

基数排序--链式基数排序(Radix)

2010-12-03 17:43 183 查看
链式基数排序:属于”分配式排序”(distribution sort)基数排序法又称“桶子法”(bucket sort)或bin sort。
链式基数排序思想:透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数。
时间效率:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(n),共进行d趟分配和收集。 空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针

/*
THE BEGINNING OF  RadixSort ----------------链式基数排序
*/
template<class T>
void InitSLList(SLList<T> &SL)
{
cout<<"Creat Static List /n Input the 数据个数:/n";
cin>>SL.recnum;
SL.SList=new SLCell<T>[SL.recnum+1];
assert(SL.SList);
cout<<"Input the 关键字 项数 /n";
cin>>SL.keynum;
for(int i=1;i<=SL.recnum;i++)
{
SL.SList[i].keys=new T[SL.keynum+1];
assert(SL.SList[i].keys);
}
SL.SList[0].next=1;
cout<<"Input 数据/n";
for(int i=1;i<=SL.recnum;i++)
{
cout<<"PLZ input the "<<i<<" th 数据/n";
for(int j=1;j<=SL.keynum;j++)
{
cin>>SL.SList[i].keys[j];
}
if(i!=SL.recnum)
SL.SList[i].next=i+1;
else
SL.SList[i].next=0;
}
}
template <class T>
void RelList(SLList<T> &SL)
{
for(int i=1;i<=SL.recnum;i++)
delete SL.SList[i].keys;
delete SL.SList;
}
template <class T>
void Output2(SLList<T> &SL)
{
for(int i=SL.SList[0].next;i;i=SL.SList[i].next)
{
for(int j=1;j<=SL.keynum;j++)
cout<<SL.SList[i].keys[j];
cout<<'/t';
}
cout<<'/n';
}
/*
按第i个关键字 keys[i] 建立 RADIX 个字表,使同一子表中记录的 keys[i] 相同
f[0...RADIX] 和 e[0...RADIX] 分别指向各个子表中第一个 和 最后一个记录
*/
template <class T>
void Distrbute(SLCell<T> *r ,int i,ArrType &f,ArrType& e)
{
int j;
for(j=0;j<RADIX;j++)  //各 子表 初始化为空
f[j]=0;
for(int a=r[0].next;a;a=r[a].next)
{
j=r[a].keys[i];
if(!f[j])
f[j]=a;
else
r[e[j]].next=a;
e[j]=a;
}
}
/*
按 keys[i] 自小到大 将 f[0..RADIX] 所指 各个子表依次 链接成一个链表
*/
template <class T>
void Collect(SLCell<T> * r, int i, ArrType &f,ArrType &e)
{
int j;
for(j=0;f[j];j++)  //找第一个 非空子表
r[0].next=f[j];  //r[0].next 指向 第一个非空子表 中的第一个节点
int t=e[j];
while(j<RADIX)
{
for(j++;j<RADIX-1&&!f[j];j++);  //找下一个非空子表
if(f[j])   //链接 两个非空子表
{
r[t].next=f[j];
t=e[j];
}
}
r[t].next=0;  //t指向 最后一个非空子表 中的 左右 一个结点
}
template <class T>
void RadixSort(SLList<T> &SL)
{
for(int i=SL.keynum;i>=1;i--)//对L作基数排序,使得L按关键字自小到大有序按最低位优先(先处理个位数,然后处理十位数……)一次对个关键字进行分配和收集
//	for(int i=1;i<=SL.keynum;i++)  //按最低位优先
{
Distrbute(SL.SList,i,f,e);
Collect(SL.SList,i,f,e);
Output2(SL);
}
}
/*
END OF  RadixSort ----------------链式基数排序
*/


cout<<" * 基数排序 */n"
<<"0 退出基数排序/n"
<<"1 链式基数排序/n";
cout<<"请选择基数排序函数:/n";
cin>>choice5;
while(choice5!=5)
{
switch(choice5)
{
case 1: //链式基数排序
SLList<int> SL;
InitSLList(SL);
cout<<"链式基数排序输入:/n";
Output2(SL);
RadixSort(SL);
cout<<"链式基数排序结果如下:/n";
Output2(SL);
RelList(SL);
break;
}
cout<<" * 基数排序 */n"
<<"0 退出基数排序/n"
<<"1 链式基数排序/n";
cout<<"请选择基数排序函数:/n";
cin>>choice5;
}
break; //end of fil3==5,链式基数排序


以下是 最低位 优先 的结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: