| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 365 人关注过本帖
标题:链式基数排序。。。。求大神帮忙。。。
只看楼主 加入收藏
周佳峰
Rank: 2
等 级:论坛游民
帖 子:12
专家分:14
注 册:2012-10-15
结帖率:0
收藏
 问题点数:0 回复次数:0 
链式基数排序。。。。求大神帮忙。。。
#include<iostream>
using namespace std;

#define KEY_SIZE 5
#define RADIX 301
#define LIST_SIZE 1000

typedef int PVector[RADIX];
typedef int KeyType;
typedef struct {
    KeyType key[KEY_SIZE];
    int next;//下一个的数组下标
}RecordType1;
typedef struct {
    RecordType1 r[LIST_SIZE];
    int keynum;
    int recnum;
}SLinkList;
SLinkList Creat()//接收考生的各科成绩
{
    SLinkList *l;
    int i=1,k=1;
    l=new SLinkList;
    l->keynum=5;
    l->recnum=3;
    for(k=0;k<l->recnum;k++)//判断是否继续输入
    {
        cout<<"输入考生语文、数学、英语成绩:"<<endl;
    cin>>l->r[i].key[1];
    cin>>l->r[i].key[2];
    cin>>l->r[i].key[3];
    l->r[i].key[0]=k+1;//学号
    l->r[i].key[4]=(l->r[i].key[1]+l->r[i].key[2]+l->r[i].key[3]);
        i++;
    }
    return *l;
}
void Distribute(RecordType1 *r,int i,PVector head,PVector tail)//以下标为i的关键字为准做一趟分配
{
    int j,p;
    for(j=0;j<=RADIX-1;++j)
        head[j]=0;//各字表初始化为空表
    for(p=r[0].next;p;p=r[p].next)
    {
        j=r[p].key[i];
        if(!head[j])
            head[j]=p;
        else
            r[tail[j]].next=p;
        tail[j]=p;//将下标p所指的节点插入第j个子表中
    }
}
void Collect(RecordType1 *r,PVector head,PVector tail)//做一趟收集
{
   
    int j;
    int t;
    j=0;
    while (head[j]==0 )                 /* 找第一个非空队列 */
        ++j;
    r[0].next =head[j];
    t=tail[j];
    while ( j<RADIX-1 )                 /* 寻找并串接所有非空队列 */
    {
        ++j;
        while ( (j<RADIX-1 ) && (head[j]==0 ) )     /* 找下一个非空队列 */
            ++j;
        if ( head[j]!=0 )       /* 链接非空队列 */
        {
            r[t].next =head[j];
            t=tail[j];
        }
    }
    r[t].next =0;             /* t指向最后一个非空队列中的最后一个结点 */
}
void RadixSort(SLinkList *l,int i)//对*l中的成绩做链式基数排序
{
    PVector head;
    PVector tail;
    for(i=0;i<(l->recnum);i++)
        l->r[i].next=i+1;
    l->r[l->recnum].next=0;

    {
        Distribute(l->r,i,head,tail);
        Collect(l->r,head,tail);
    }
}
void ShowRank(SLinkList *l)//按名次顺序输出考生的名次和分数
{
    int rank=1,i;
    cout<<"考生名次和分数分别为:"<<endl;
    for(i=l->r[0].next;rank<=l->recnum;rank++)
    {
        cout<<rank<<"  "<<l->r[i].key[0]<<"  "<<l->r[i].key[1]<<"  "<<l->r[i].key[2]<<"  "<<l->r[i].key[3]<<"  "<<l->r[i].key[4]<<endl;
        i=l->r[i].next;
    }
}


int main()
{
    SLinkList L;
    L=Creat();
   
    RadixSort(&L,1);
    RadixSort(&L,2);
    RadixSort(&L,3);
 
    ShowRank(&L);
    return 0;
}
这个为什么不能按想要的关键字排序啊???
搜索更多相关主题的帖子: next include 
2013-01-01 18:12
快速回复:链式基数排序。。。。求大神帮忙。。。
数据加载中...
 
   



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

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