查找排序的应用实验.docx
- 文档编号:11538076
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:15
- 大小:140.67KB
查找排序的应用实验.docx
《查找排序的应用实验.docx》由会员分享,可在线阅读,更多相关《查找排序的应用实验.docx(15页珍藏版)》请在冰豆网上搜索。
查找排序的应用实验
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
查找、排序的应用实验
班级:
学号:
姓名:
排序、查找的应用实验报告要求
1目的与要求:
1)查找、排序是日常数据处理过程中经常要进行的操作和运算,掌握其算法与应用对于提高学生数据处理能力和综合应用能力显得十分重要。
2)本次实验前,要求同学完整理解有关排序和查找的相关算法和基本思想以及种算法使用的数据存储结构;
3)利用C或C++语言独立完成本次实验内容或题目,程序具有良好的交互性(以菜单形式列出实验排序和显示命令,并可进行交互操作)和实用性;
4)本次实验为实验成绩评定主要验收内容之一,希望同学们认真对待,并按时完成实验任务;
5)本次实验为综合性实验,请于2012年12月23日按时提交实验报告(纸质报告每班10份);
6)下周开始数据结构课程设计,务必按时提交实验报告,任何同学不得拖延。
2实验内容或题目
题目:
对记录序列(查找表):
{287,109,063,930,589,184,505,269,008,083}分别实现如下操作:
1)分别使用直接插入排序、冒泡排序、快速排序、简单选择排序、堆排序(可选)、链式基数排序算法对纪录序列进行排序,并显示排序结果;
2)对上述纪录列表排好序,然后对其进行折半查找或顺序查找;
(特别要求:
使用菜单机制,在一个主程序下实现题目要求的排序和查找以及结果显示)
3实验步骤与源程序
#include
#include
/*链式基数法排序声明*/
#defineRADIX10
#defineKEY_SIZE6
#defineLIST_SIZE20
#defineTRUE1
#defineFALSE0
typedefintKeyType;
typedefintOtherType;
typedefstruct
{
KeyTypekey[KEY_SIZE];/*子关键字数组*/
OtherTypeother_data;/*其它数据项*/
intnext;/*静态链域*/
}RecordType1;
typedefstruct
{
RecordType1r[LIST_SIZE+1];/*r[0]为头结点*/
intlength;
intkeynum;
}SLinkList;/*静态链表*/
typedefintPVector[RADIX];
typedefstruct
{
intnext;
KeyTypekey;
OtherTypeother_data;
}RecordType;
voidInsSort(RecordTyper[],intlength)
/*对记录数组r做直接插入排序,length为数组中待排序记录的数目*/
{
inti,j;
for(i=2;i<=length;i++)
{
r[0]=r[i];/*将待插入记录存放到监视哨r[0]中*/
j=i-1;
while(r[0].key { r[j+1]=r[j]; j=j-1; } r[j+1]=r[0];/*将待插入记录插入到已排序的序列中*/ } }/*InsSort*/ //顺序查找 voidSeqSearch(RecordTyper[],intlength,KeyTypek) { inti; r[0].key=k; i=length; while(r[i].key! =k)i--; printf("该元素在数组中的位置是%d",i); } //冒泡排序 voidBubbleSort(RecordTyper[],intlength) /*对记录数组r做冒泡排序,length为数组的长度*/ { intn,i,j; intchange; RecordTypex; n=length; change=TRUE; for(i=1;i<=n-1&&change;++i) { change=FALSE; for(j=1;j<=n-i;++j) if(r[j].key>r[j+1].key) { x=r[j]; r[j]=r[j+1]; r[j+1]=x; change=TRUE; } } }/*BubbleSort*/ //快速排序 intQKPass(RecordTyper[],intleft,intright) /*对记录数组r中的r[left]至r[right]部分进行一趟排序,并得到基准的位置,使得排序后的结果满足其之后(前)的记录的关键字均不小于(大于)于基准记录*/ { RecordTypex; intlow,high; x=r[left];/*选择基准记录*/ low=left; high=right; while(low { while(low /*high从右到左找小于x.key的记录*/ high--; if(low { r[low]=r[high]; low++; } /*找到小于x.key的记录,则进行交换*/ while(low low++; if(low { r[high]=r[low]; high--; }/*找到大于x.key的记录,则交换*/ } r[low]=x;/*将基准记录保存到low=high的位置*/ returnlow;/*返回基准记录的位置*/ }/*QKPass*/ voidSelectSort(RecordTyper[],intlength) /*对记录数组r做简单选择排序,length为数组的长度*/ { inti,j,k,n; RecordTypex; n=length; for(i=1;i<=n-1;++i) { k=i; for(j=i+1;j<=n;++j) if(r[j].key if(k! =i) { x=r[i]; r[i]=r[k]; r[k]=x; } } } voidQKSort(RecordTyper[],intlow,inthigh) /*对记录数组r[low..high]用快速排序算法进行排序*/ { intpos; if(low { pos=QKPass(r,low,high);/*调用一趟快速排序,将枢轴元素为界划分两个子表*/ QKSort(r,low,pos-1);/*对左部子表快速排序*/ QKSort(r,pos+1,high);/*对右部子表快速排序*/ } } //堆排序 voidsift(RecordTyper[],intk,intm) /*假设r[k..m]是以r[k]为根的完全二叉树,且分别以r[2k]和r[2k+1]为根的左、右子树为大根堆,调整r[k],使整个序列r[k..m]满足堆的性质*/ { RecordTypet; inti,j; intx; intfinished; t=r[k];/*暂存"根"记录r[k]*/ x=r[k].key; i=k; j=2*i; finished=FALSE; while(j<=m&&! finished) { if(j j=j+1;/*若存在右子树,且右子树根的关键字大,则沿右分支"筛选"*/ if(x>=r[j].key) finished=TRUE;/*筛选完毕*/ else { r[i]=r[j]; i=j; j=2*i; }/*继续筛选*/ } r[i]=t;/*r[k]填入到恰当的位置*/ } voidcrt_heap(RecordTyper[],intlength) /*对记录数组r建堆,length为数组的长度*/ { inti,n; n=length; for(i=n/2;i>=1;--i)/*自第[n/2]个记录开始进行筛选建堆*/ sift(r,i,n); } voidHeapSort(RecordTyper[],intlength) /*对r[1..n]进行堆排序,执行本算法后,r中记录按关键字由大到小有序排列*/ { inti,n; RecordTypeb; crt_heap(r,length); n=length; for(i=n;i>=2;--i) { b=r[1];/*将堆顶记录和堆中的最后一个记录互换*/ r[1]=r[i]; r[i]=b; sift(r,1,i-1);/*进行调整,使r[1..i-1]变成堆*/ } }/*HeapSort*/ //链式基数排序 voidDistribute(RecordType1r[],inti,PVectorhead,PVectortail) /*记录数组r中记录已按低位关键字key[i+1],…,key[d]进行过"低位优先"排序。 本算法按第i位关键字key[i]建立RADIX个队列,同一个队列中记录的key[i]相同。 head[j]和tail[j]分别指向各队列中第一个和最后一个记录(j=0,1,2,…,RADIX-1)。 head[j]=0表示相应队列为空队列*/ { intj; intp; for(j=0;j<=RADIX-1;++j) head[j]=0;/*将RADIX个队列初始化为空队列*/ p=r[0].next;/*p指向链表中的第一个记录*/ while(p! =0) { j=r[p].key[i];/*用记录中第i位关键字求相应队列号*/ if(head[j]==0) head[j]=p;/*将p所指向的结点加入第j个队列中*/ else r[tail[j]].next=p; tail[j]=p; p=r[p].next; } }/*Distribute*/ voidCollect(RecordType1r[],PVectorhead,PVectortail) /*本算法从0到RADIX-1扫描各队列,将所有非空队列首尾相接,重新链接成一个链表*/ { intj; intt; j=0; while(head[j]==0)/*找第一个非空队列*/ ++j; r[0].next=head[j]; t=tail[j]; while(j { ++j; while((j ++j; if(head[j]! =0)/*链接非空队列*/ { r[t].next=head[j]; t=tail[j]; } } r[t].next=0;/*t指向最后一个非空队列中的最后一个结点*/ }/*Collect*/ voidRadixSort(RecordType1r[],intlength) /*length个记录存放在数组r中,执行本算法进行基数排序后,链表中的记录将按关键字从小到大的顺序相链接。 */ { inti,n; intd; PVectorhead; PVectortail; n=length; for(i=0;i<=n-1;++i) r[i].next=i+1;/*构造静态链表*/ r[n].next=0; d=3; for(i=d-1;i>=0;--i)/*从最低位子关键字开始,进行d趟分配和收集*/ { Distribute(r,i,head,tail);/*第i趟分配*/ Collect(r,head,tail);/*第i趟收集*/ } }/*RadixSort*/ voidmain() { intflag=1,i,j,k,b; RecordTyper[20]; intlen; printf("************功能菜单************\n"); printf("1.直接插入排序;2.冒泡排序;\n"); printf("3.快速排序;4.简单选择排序;\n"); printf("5.堆排序;6.顺序查找;\n"); printf("7.链式基数排序;8.退出;\n"); printf("请输入待排序记录的长度: "); scanf("%d",&len); for(i=1;i<=len;i++) { printf("请输入第%d个记录元素: ",i); fflush(stdin); scanf("%d",&j); r[i].key=j; } printf("原记录序列: "); for(i=1;i<=len;i++) printf("%d",r[i].key); printf("\n"); while(flag) { printf("请选择操作: "); scanf("%d",&b); switch(b) { case1: //直接插入排序 printf("\n直接插入排序结果: \n"); InsSort(r,len); for(i=1;i<=len;i++) printf("%d",r[i].key); printf("\n");break; case2: //冒泡排序 printf("冒泡排序结果: \n"); BubbleSort(r,len); for(i=1;i<=len;i++) printf("%d",r[i].key); printf("\n"); break; case3: //快速排序 printf("快速排序结果: \n"); QKSort(r,1,len); for(i=1;i<=len;i++) printf("%d",r[i].key); printf("\n");break; case4: //简单选择排序 SelectSort(r,len); for(i=1;i<=len;i++) printf("%d",r[i].key); printf("\n");break; case5: //堆排序 printf("堆排序结果: \n"); HeapSort(r,len); for(i=1;i<=len;i++) printf("%d",r[i].key); printf("\n");break; case6: //进行顺序查找 printf("请输入您要查找的元素: "); fflush(stdin); scanf("%d",&k); SeqSearch(r,len,k); printf("\n"); break; case7: //链式基数排序 RecordType1a[20]; intp; printf("请输入待排序记录的长度: "); scanf("%d",&len); for(i=1;i<=len;i++) { printf("请输入第%d个记录元素: ",i); fflush(stdin); scanf("%d",&j); a[i].key[0]=j/100; a[i].key[1]=(j-100*a[i].key[0])/10; a[i].key[2]=(j-100*a[i].key[0]-10*a[i].key[1]); } printf("原纪录: "); for(i=1;i<=len;i++) printf("%d",a[i].key[0]*100+a[i].key[1]*10+a[i].key[2]); printf("\n"); RadixSort(a,len); p=a[0].next; printf("链式基数排序结果: \n"); while(p! =0) { printf("%d",a[p].key[0]*100+a[p].key[1]*10+a[p].key[2]); p=a[p].next; } printf("\n");break; case8: //退出 flag=0; } } } 4测试数据与实验结果(可以抓图粘贴) 5结果分析与实验体会 因为老师给了很多的源代码,再加上之前做过查找的实验,所以这次的实验不是很困难,虽然做的时候还是出现了不少错误,但是自己都解决了。 通过这次实验,更加了解到链式基数排序的用法,如果不是三位数,是四位数的话,还要改代码,就这点比较麻烦。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 排序 应用 实验