数据结构例程——基数排序

本文是[数据结构基础系列(9):排序]中第10课时[基数排序]的例程。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAXE 20         //线性表中最多元素个数
#define MAXR 10         //基数的最大取值
#define MAXD 8          //关键字位数的最大取值
typedef struct node
{
    char data[MAXD];    //记录的关键字定义的字符串
    struct node *next;
} RecType;
void CreaLink(RecType *&p,char *a[],int n);
void DispLink(RecType *p);
void RadixSort(RecType *&p,int r,int d) //实现基数排序:*p为待排序序列链表指针,r为基数,d为关键字位数
{
    RecType *head[MAXR],*tail[MAXR],*t; //定义各链队的首尾指针
    int i,j,k;
    for (i=0; i<=d-1; i++)                  //从低位到高位循环
    {
        for (j=0; j<r; j++)                 //初始化各链队首、尾指针
            head[j]=tail[j]=NULL;
        while (p!=NULL)                 //对于原链表中每个结点循环
        {
            k=p->data[i]-'0';           //找第k个链队
            if (head[k]==NULL)          //进行分配
            {
                head[k]=p;
                tail[k]=p;
            }
            else
            {
                tail[k]->next=p;
                tail[k]=p;
            }
            p=p->next;                  //取下一个待排序的元素
        }
        p=NULL;                         //重新用p来收集所有结点
        for (j=0; j<r; j++)             //对于每一个链队循环
            if (head[j]!=NULL)          //进行收集
            {
                if (p==NULL)
                {
                    p=head[j];
                    t=tail[j];
                }
                else
                {
                    t->next=head[j];
                    t=tail[j];
                }
            }
        t->next=NULL;                   //最后一个结点的next域置NULL
        //以下的显示并非必要
        printf("  按%d位排序\t",i);
        DispLink(p);
    }
}
void CreateLink(RecType *&p,char a[MAXE][MAXD],int n)   //采用后插法产生链表
{
    int i;
    RecType *s,*t;
    for (i=0; i<n; i++)
    {
        s=(RecType *)malloc(sizeof(RecType));
        strcpy(s->data,a[i]);
        if (i==0)
        {
            p=s;
            t=s;
        }
        else
        {
            t->next=s;
            t=s;
        }
    }
    t->next=NULL;
}
void DispLink(RecType *p)   //输出链表
{
    while (p!=NULL)
    {
        printf("%c%c ",p->data[1],p->data[0]);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    int n=10,r=10,d=2;
    int i,j,k;
    RecType *p;
    char a[MAXE][MAXD];
    int b[]= {75,23,98,44,57,12,29,64,38,82};
    for (i=0; i<n; i++)     //将b[i]转换成字符串
    {
        k=b[i];
        for (j=0; j<d; j++) //例如b[0]=75,转换后a[0][0]='7',a[0][1]='5'
        {
            a[i][j]=k%10+'0';
            k=k/10;
        }
        a[i][j]='\0';
    }
    CreateLink(p,a,n);
    printf("\n");
    printf("  初始关键字\t");        //输出初始关键字序列
    DispLink(p);
    RadixSort(p,10,2);
    printf("  最终结果\t");         //输出最终结果
    DispLink(p);
    printf("\n");
    return 0;
}
已标记关键词 清除标记
相关推荐
计算机科学丛书·数据结构与算法分析:Java语言描述(原书第3版) [美]马克·艾伦·维斯 (Mark Allen Weiss) (作者), 冯舜玺 (译者), 陈越 (译者) 目录 出版者的话 前言 第1章引论1 1.1本书讨论的内容1 1.2数学知识复习2 1.2.1指数2 1.2.2对数2 1.2.3级数2 1.2.4模运算4 1.2.5证明的方法4 1.3递归简论5 1.4实现泛型构件pre—Java57 1.4.1使用Object表示泛型8 1.4.2基本类型的包装9 1.4.3使用接口类型表示泛型9 1.4.4数组类型的兼容性10 1.5利用Java5泛型特性实现泛型构件11 1.5.1简单的泛型类和接口11 1.5.2自动装箱/拆箱11 1.5.3菱形运算符12 1.5.4带有限制的通配符12 1.5.5泛型static方法14 1.5.6类型限界14 1.5.7类型擦除15 1.5.8对于泛型的限制15 1.6函数对象16 小结18 练习18 参考文献19 第2章算法分析20 2.1数学基础20 2.2模型22 2.3要分析的问题22 2.4运行时间计算24 2.4.1一个简单的例子24 2.4.2一般法则24 2.4.3最大子序列和问题的求解26 2.4.4运行时间中的对数31 2.4.5分析结果的准确性33 小结33 练习34 参考文献37 第3章表、栈和队列39 3.1抽象数据类型39 3.2表ADT39 3.2.1表的简单数组实现40 3.2.2简单链表40 3.3JavaCollectionsAPI中的表41 3.3.1Collection接口41 3.3.2Iterator接口42 3.3.3List接口、ArrayList类和LinkedList类43 3.3.4例子:remove方法对LinkedList类的使用44 3.3.5关于ListIterator接口46 3.4ArrayList类的实现46 3.4.1基本类46 3.4.2迭代器、Java嵌套类和内部类49 3.5LinkedList类的实现52 3.6栈ADT58 3.6.1栈模型58 3.6.2栈的实现59 3.6.3应用59 3.7队列ADT65 3.7.1队列模型65 3.7.2队列的数组实现65 3.7.3队列的应用66 小结67 练习67 第4章树71 4.1预备知识71 4.1.1树的实现72 4.1.2树的遍历及应用72 4.2二叉树75 4.2.1实现76 4.2.2例子:表达式树76 4.3查找树ADT——二叉查找树78 4.3.1contains方法79 4.3.2findMin方法和findMax方法80 4.3.3insert方法80 4.3.4remove方法82 4.3.5平均情况分析83 4.4AVL树86 4.4.1单旋转87 4.4.2双旋转89 4.5伸展树94 4.5.1一个简单的想法(不能直接使用)95 4.5.2展开96 4.6再探树的遍历100 4.7B树101 4.8标准库中的集合与映射105 4.8.1关于Set接口105 4.8.2关于Map接口105 4.8.3TreeSet类和TreeMap类的实现106 4.8.4使用多个映射的实例106 小结111 练习111 参考文献115 第5章散列117 5.1一般想法117 5.2散列函数117 5.3分离链接法119 5.4不用链表的散列表123 5.4.1线性探测法123 5.4.2平方探测法124 5.4.3双散列129 5.5再散列130 5.6标准库中的散列表132 5.7最坏情形下O(1)访问的散列表133 5.7.1完美散列133 5.7.2布谷鸟散列135 5.7.3跳房子散列143 5.8通用散列法146 5.9可扩散列148 小结149 练习150 参考文献153 第6章优先队列(堆)156 6.1模型156 6.2一些简单的实现156 6.3二叉堆157 6.3.1结构性质157 6.3.2堆序性质157 6.3.3基本的堆操作158 6.3.4其他的堆操作162 6.4优先队列的应用164 6.4.1选择问题164 6.4.2事件模拟165 6.5d—堆166 6.6左式堆167 6.6.1左式堆性质167 6.6.2左式堆操作168 6.7斜堆172 6.8二项队列173 6.8.1二项队列结构174 6.8.2二项队列操作174 6.8.3二项队列的实现176 6.9标准库中的优先队列180 小结180 练习181 参考文献184 第7章排序186 7.1预备知识186 7.2插入排序186 7.2.1算法186 7.2.2插入排序的分析187 7.3一些简单排序算法的下界187 7.4希尔排序188 7.5堆排序191 7.6归并排序193 7.7快速排序198 7.7.1选取枢纽元199 7.7.2分割策略200 7.7.3小数组202 7.7.4实际的快速排序例程202 7.7.5快速排序的分析203 7.7.6选择问题的线性期望时间算法206 7.8排序算法的一般下界207 7.9选择问题的决策树下界209 7.10对手下界210 7.11线性时间的排序:桶排序和基数排序212 7.12外部排序216 7.12.1为什么需要一些新的算法217 7.12.2外部排序模型217 7.12.3简单算法217 7.12.4多路合并218 7.12.5多相合并219 7.12.6替换选择219 小结220 练习221 参考文献225 第8章不相交集类227 8.1等价关系227 8.2动态等价性问题227 8.3基本数据结构229 8.4灵巧求并算法231 8.5路径压缩233 8.6路径压缩和按秩求并的最坏情形234 8.6.1缓慢增长的函数235 8.6.2利用递归分解的分析235 8.6.3O(Mlog*N)界240 8.6.4O(Mα(M,N))界240 8.7一个应用241 小结243 练习243 参考文献244 第9章图论算法246 9.1若干定义246 9.2拓扑排序248 9.3最短路径算法250 9.3.1无权最短路径251 9.3.2Dijkstra算法254 9.3.3具有负边值的图258 9.3.4无圈图259 9.3.5所有点对最短路径261 9.3.6最短路径的例子261 9.4网络流问题262 9.5最小生成树267 9.5.1Prim算法267 9.5.2Kruskal算法269 9.6深度优先搜索的应用270 9.6.1无向图270 9.6.2双连通性271 9.6.3欧拉回路273 9.6.4有向图275 9.6.5查找强分支276 9.7NP—完全性介绍277 9.7.1难与易278 9.7.2NP类278 9.7.3NP—完全问题279 小结280 练习280 参考文献284 第10章算法设计技巧288 10.1贪婪算法288 10.1.1一个简单的调度问题288 10.1.2哈夫曼编码290 10.1.3近似装箱问题293 10.2分治算法298 10.2.1分治算法的运行时间298 10.2.2最近点问题300 10.2.3选择问题302 10.2.4一些算术问题的理论改进304 10.3动态规划307 10.3.1用一个表代替递归307 10.3.2矩阵乘法的顺序安排309 10.3.3最优二叉查找树311 10.3.4所有点对最短路径312 10.4随机化算法314 10.4.1随机数发生器315 10.4.2跳跃表319 10.4.3素性测试320 10.5回溯算法322 10.5.1收费公路重建问题323 10.5.2博弈326 小结331 练习331 参考文献336 第11章摊还分析340 11.1一个无关的智力问题340 11.2二项队列340 11.3斜堆344 11.4斐波那契堆345 11.4.1切除左式堆中的节点346 11.4.2二项队列的懒惰合并347 11.4.3斐波那契堆操作349 11.4.4时间界的证明350 11.5伸展树351 小结354 练习354 参考文献355 第12章高级数据结构及其实现356 12.1自顶向下伸展树356 12.2红黑树362 12.2.1自底向上的插入362 12.2.2自顶向下红黑树363 12.2.3自顶向下的删除367 12.3treap树368 12.4后缀数组与后缀树370 12.4.1后缀数组371 12.4.2后缀树373 12.4.3线性时间的后缀数组和后缀树的构建375 12.5k—d树385 12.6配对堆387 小结392 练习393 参考文献396
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页