查找排序综合实验.docx
- 文档编号:24030508
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:24
- 大小:145.53KB
查找排序综合实验.docx
《查找排序综合实验.docx》由会员分享,可在线阅读,更多相关《查找排序综合实验.docx(24页珍藏版)》请在冰豆网上搜索。
查找排序综合实验
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
查找、排序综合实验
班级:
学号:
姓名:
排序、查找的应用实验报告要求
1目的与要求:
1)查找、排序是日常数据处理过程中经常要进行的操作和运算,掌握其算法与应用对于提高学生数据处理能力和综合应用能力显得十分重要。
2)本次实验前,要求同学完整理解有关排序和查找的相关算法和基本思想以及种算法使用的数据存储结构;
3)利用C或C++语言独立完成本次实验内容或题目,程序具有良好的交互性(以菜单机制实现实验程序的交互运行)和实用性;
4)本次实验在机房现场验收和平分,希望同学们认真对待,并按时完成实验任务;
5)认真书写实验报告(包括程序清单及相关实验数据与完整运行结果),并于16周周五前提交,综合实验纸质报告每班收10份。
2实验内容或题目
题目:
对记录序列(查找表):
{55,13,23,72,109,67,02,78,13}分别实现如下操作:
1)顺序查找;
2)分别使用直接插入排序、冒泡排序、快速排序对原纪录序列进行排序(本次要做);
3)对排好序的纪录序列表进行折半查找;
4)利用原纪录序列建立一颗二叉排序树,并在其上实现特定关键字值结点的查找;
5)按照“除留余数法”哈希构造函数和线性探测再散列的冲突处理方法创建表长为m=11的哈希表(本次实验做);
6)实现5)创建哈希表上的查找。
7)看懂书上“链式基数排序”方法的分配收集排序举例,并以书上例题为例,实现这种排序方法。
(选作)
3实验步骤与源程序
#include
#include
#definemaxsize12
#defineTRUE1
#defineFALSE0
#defineNULL0
#definelistsize9
#definekeysize9
#defineMAX100
#defineradix9
typedefintkeytype;
typedefstruct
{
intkey;
intflag;
}Elemtype;
typedefstruct
{
Elemtype*elem;
intsizeindex;
intcount;
}HashTable;
typedefstructnode
{
intkey;
structnode*lchild,*rchild;
}bstnode,*bstree;
typedefstruct
{
intkey;
intnext;
}recordtype;
typedefstruct
{
keytypekey[keysize];
inttype;
intnext;
}recordtype1;
typedefstruct
{
recordtype1r[keysize+1];
intlength;
intkeynum;
}slinklist;
typedefstruct
{
recordtyper[listsize+1];
intlength;
}recordlist;
typedefintpvector[radix];
//创建哈希表
intCreatHashTable(HashTable*H,intm)
{
inti,keys,p,len;
H->elem=(Elemtype*)malloc(sizeof(Elemtype));
H->sizeindex=MAX;
H->count=0;
cout<<"请输入该组关键字的个数:
"< cin>>m; cout<<"请输入表长len: "< cin>>len; H->sizeindex=len; for(i=0;i { H->elem[i].flag=0; } cout<<"请输入该组关键字: "< for(i=0;i { cin>>keys; p=keys%m; while(H->elem[p].flag==1) { intd=1; p=(p+d)%m; d++; } H->elem[p].key=keys; H->elem[p].flag=1; H->count++; } for(intj=H->count;j H->elem[j].key=0; cout<<"哈希表创建完毕! "< cout<<"下标关键字"< for(i=0;i { cout< cout< } return1; } voidSearchHashTable(HashTable*H) { intkeys,p; cout<<"请输入您要查找的关键字: "< cin>>keys; for(inti=0;i { if(keys==H->elem[i].key) p=i; } if(p>-1&&p { cout<<"查找成功! "< cout<<"该关键字在哈希表中的下标为: "< } else cout<<"查找失败,表中无此关键字! "< } //初始化 voidinitrecord(recordlist*l) { l->r[1].key=55; l->r[2].key=13; l->r[3].key=23; l->r[4].key=72; l->r[5].key=109; l->r[6].key=67; l->r[7].key=2; l->r[8].key=78; l->r[9].key=13; } //顺序查找 intseqsearch(recordlist*l,intk) { inti=l->length; while(i>=1&&l->r[i].key! =k)i--; if(i>=1) { cout<<"存在该元素: "< cout<<"该元素所在位置: "< return(i); } else { cout<<"不存在该元素! "< return(0); } } //直接插入排序 voidinssort(recordlist*l) { intj; for(inti=2;i<=l->length;i++) { l->r[0].key=l->r[i].key; j=i-1; while(l->r[0].key { l->r[j+1].key=l->r[j].key; j=j-1; } l->r[j+1].key=l->r[0].key; } for(intm=1;m<=l->length;m++) cout< cout< } //冒泡排序 voidbubblesort(recordlist*l) { inti,j,x; intchange=TRUE; for(i=1;i<=l->length&&change;++i) { change=FALSE; for(j=1;j<=l->length-i;++j) if(l->r[j].key>l->r[j+1].key) { x=l->r[j].key; l->r[j].key=l->r[j+1].key; l->r[j+1].key=x; change=TRUE; } } for(intm=1;m<=l->length;m++) cout< cout< } //快速排序 intqkpass(recordlist*l,intleft,intright) { intx=l->r[left].key; intlow=left; inthigh=right; while(low { while(low high--; if(low { l->r[low].key=l->r[high].key; low++; } while(low low++; if(low { l->r[high].key=l->r[low].key; high--; } } l->r[low].key=x; returnlow; } voidqksort(recordlist*l,intlow,inthigh) { intpos; if(low<=high) { pos=qkpass(l,low,high); qksort(l,low,pos-1); qksort(l,pos+1,high); } } //折半查找 intbinsrch(recordlist*l,intk) { intlow=1,high=l->length,mid; while(low<=high) { mid=(low+high)/2; if(k==l->r[mid].key) { cout<<"存在该元素: "< cout<<"该元素所在位置: "< return (1); } elseif(k high=mid-1; else low=mid+1; } cout<<"查找失败! "< return(0); } //建立平衡二叉排序树 voidinsertbst(bstree*bst,intk) { bstrees; if(*bst==NULL) { s=(bstnode*)malloc(sizeof(bstnode)); s->key=k; s->lchild=NULL; s->rchild=NULL; *bst=s; } elseif(k<(*bst)->key) insertbst(&((*bst)->lchild),k); elseif(k>(*bst)->key) insertbst(&((*bst)->rchild),k); } voidcreatbstree(bstree*bst) { intk; *bst=NULL; cout<<"输入元素: "< cin>>k; while(k! =0) { insertbst(bst,k); cout<<"输入元素: "< cin>>k; } } //二叉树查找 intsearchbst(bstreebst,intk) { if(! bst)returnNULL; elseif(bst->key==k) { cout<<"输出特定元素: "< return1; } else if(k searchbst(bst->lchild,k); else searchbst(bst->rchild,k); return0; } //简单排序 voidselectsort(recordlist*l) { inti,j,k,x; for(i=1;i<=l->length;++i) { k=i; for(j=1;j<=l->length;++j) { if(l->r[j].key k=j; if(k! =i) { x=l->r[i].key; l->r[i].key=l->r[k].key; l->r[k].key=x; } } } } voidmain() { intf=1,e,k,r,q; chars; recordlist*L; slinklist*L1; HashTable*h; h=(HashTable*)malloc(sizeof(HashTable)); bstree*B; L1=(slinklist*)malloc(sizeof(slinklist)); L=(recordlist*)malloc(sizeof(recordlist)); B=(bstree*)malloc(sizeof(bstree)); cout<<"输入所创顺序表的长度: "< cin>>r; L->length=r; cout<<"输入表的元素: "< for(inti=1;i<=L->length;i++) cin>>L->r[i].key; while(f) { cout< cout<<"-------------请输入序号: -----------------"< cout<<"顺序查找请输入: A"< cout<<"直接插入排序请输入: B"< cout<<"冒泡排序请输入: C"< cout<<"快速排序请输入: D"< cout<<"折半查找请输入: E"< cout<<"建立二叉排序树请输入: F"< cout<<"查找二叉树特定关键字请输入: G"< cout<<"建立哈希表请输入: H"< cout<<"哈希表上查找请输入: I"< cout<<"简单排序请输入: J"< cout<<"退出请输入: K"< cout<<"输入操作序号: "< cin>>s; switch(s) { case'A': cout<<"进行顺序查找: "< cout<<"输入要查找的元素: "< cin>>k; seqsearch(L,k); break; case'B': cout<<"进行直接插入排序: "< inssort(L); break; case'C': cout<<"进行还原: "< initrecord(L); for(e=1;e<=L->length;e++) cout< cout< cout<<"进行冒泡排序: "< bubblesort(L); break; case'D': cout<<"进行还原: "< initrecord(L); for(e=1;e<=L->length;e++) cout< cout< cout<<"快速排序: "< qksort(L,1,9); for(q=1;q<=L->length;q++) cout< cout< break; case'E': cout<<"进行折半查找: "< cout<<"输入要查找的元素: "< cin>>k; binsrch(L,k); break; case'F': cout<<"建立二叉排序树,最后以00结束: "< creatbstree(B); break; case'G': cout<<"二叉排序树查找特定元素: "< cout<<"输入要查找元素: "< cin>>k; searchbst(*B,k); break; case'H': cout<<"创建哈希表: "< CreatHashTable(h,9); break; case'I': cout<<"哈希表上的查找: "< SearchHashTable(h); break; case'J': cout<<"进行还原: "< initrecord(L); for(e=1;e<=L->length;e++) cout< cout< cout<<"简单选择排序: "< selectsort(L); for(q=1;q<=L->length;q++) cout< cout< break; case'K': f=0; cout<<"退出! "< break; } } } 4测试数据与实验结果(可以抓图粘贴) 5结果分析与实验体会 这是最后一次试验了,也算是比较难的实验。 我感觉这次试验花了自己很多的时间,首先要充分理解书本上的知识和算法,但是,仅仅这样还不足以完成这次试验,我又到图书馆查阅了很多本章的知识和算法,结合书本和实验内容才完成这次试验。 这次试验,给了我很多的教训,使我为即将到来的课程设计做好了心理准备。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 排序 综合 实验