实验五查找及排序讲解.docx
《实验五查找及排序讲解.docx》由会员分享,可在线阅读,更多相关《实验五查找及排序讲解.docx(21页珍藏版)》请在冰豆网上搜索。
实验五查找及排序讲解
实验五查找及排序
实验课程名:
数据结构与算法
一、实验目的及要求
1、掌握查找的不冋方法,并能用咼级语言实现查找算法。
2、熟练掌握顺序表的查找方法和有序顺序表的折半查找算法。
3、掌握常用的排序方法,并能用高级语言实现排序算法。
4、深刻理解排序的定义和各种排序方法的特点,并能加以灵活运用。
5、了解各种方法的排序过程及依据的原则,并掌握各种排序方法的时间复杂度的分析方法。
二、实验内容
任务一:
顺序表的顺序查找。
有序表的折半查找。
完成下列程序,该程序实现高考成绩表(如下表所示)的顺序查找,在输出结果中显示查
准考证号
姓名
各科成绩
总分
政治
语文
外语
数学
物理
化学
生物
179328
何芳芳
85
89
98
100
93
80
47
592
179325
陈红
85
P86
88
100
92
—90
45
586
179326
陆华
78
75
90
80
95
88
37
543
179327
张平
82
80
78
98
84
96
40
558
179324
赵小怡
76
85
94
57
77
69
44
502
找成功与查找不成功信息。
解答:
(1)源代码:
#include//EOF("Z或F6),NULL
#include//atoi()
#include//eof()
#include//floor(),ceil(),abs()
#include//exit()
#include//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW®为3,故去掉此行
typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,
如OK等
typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE
#defineMAX_LENGTH100
#includevstring.h>
#include
或F6),NULL
#include//malloc()#include//INT_MAX#include//EOF(=AZ
#include//atoi()#include//eof()
#include//floor(),ceil(),abs()#include//exit()
#include//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW®:
为3,故去掉此行
typedefintStatus;//Status
如OK等
typedefintBoolean;//Boolean
#defineN5//数据元素个数
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<(b))
设关键字域为长整型
定义关键字为准考证号
数据元素类型(以教科书图9.1高考成绩为例)
#defineLQ(a,b)((a)<=(b))
typedeflongKeyType;//
#definekeynumber//
structElemType//
准考证号,与关键字类型同
姓名(4个汉字加1个串结束标志)政治
语文
英语
数学
物理
化学
生物
总分
{
longnumber;//
charname[9];//
intpolitics;//
intChinese;//
intEnglish;//
intmath;//
intphysics;//
intchemistry;//
intbiology;//
inttotal;//
};
typedefstruct{
ElemType*elem;//数据元素存储空间基址,建表时按实际长度分配,
号单元留空
intlength;//表长度
}SSTable;
voidCreat_Seq(SSTable&ST,ElemTyper[],intn)
{//操作结果:
由含n个数据元素的数组r构造静态顺序查找表ST
inti;
ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType));//动态生成
个数据元素空间(0号单元不用)
if(!
ST.elem)
exit(ERROR);
for(i=1;i<=n;i++)
ST.elem[i]=r[i-1];//将数组r的值依次赋给ST
ST.length=n;
}
voidAscend(SSTable&ST)
{//重建静态查找表为按关键字非降序排序
inti,j,k;
for(i=1;i{
k=i;
ST.elem[O]=ST.elem[i];//待比较值存[0]单元
for(j=i+1;j<=ST」ength;j++)
ifLT(ST.elem[j].key,ST.elem[O].key)
{
k=j;
ST.elem[0]=ST.elem[j];
}
if(k!
=i)//有更小的值则交换
{
ST.elem[k]=ST.elem[i];
ST.elem[i]=ST.elem[O];
}
}
}
voidCreat_Ord(SSTable&ST,ElemTyper[],intn)
{//操作结果:
由含n个数据元素的数组r构造按关键字非降序查找表
Creat_Seq(ST,r,n);//建立无序的查找表ST
Ascend(ST);//将无序的查找表ST重建为按关键字非降序查找表
}
StatusDestroy(SSTable&ST)
{//初始条件:
静态查找表ST存在。
操作结果:
销毁表ST
free(ST.elem);
ST.elem=NULL;
ST.length=O;
n+1
ST
returnOK;
}
intSearch_Seq(SSTableST,KeyTypekey)
{//在顺序表ST中顺序查找其关键字等于key的数据元素。
若找到,则返回
//该元素在表中的位置,否则返回0。
算法9.1
inti;
ST.elem[0].key=key;//哨兵
for(i=ST.Iength;!
EQ(ST.elem[i].key,key);--i);//从后往前找
returni;//找不到时,i为0
}
voidTraverse(SSTableST,void(*Visit)(ElemType))
{//初始条件:
静态查找表ST存在,Visit()是对元素操作的应用函数
//操作结果:
按顺序对ST的每个元素调用函数Visit()一次且仅一次
ElemType*p;
inti;
p=++ST.elem;//p指向第一个元素
for(i=1;i<=ST.length;i++)
Visit(*p++);
}
voidprint(ElemTypec)//Traverse。
调用的函数
{
printf("%-8ld%-8s%4d%5d%5d%5d%5d%5d%5d%5d\n",c.number,c.name
c.politics,
c.Chinese,c.English,c.math,c.physics,c.chemistry,c.biology,c.total);
}
intmain()
{
ElemTyper[N]={{179328,"何芳芳",85,89,98,100,93,80,47},
{179325,"陈红",85,86,88,100,92,90,45},
{179326,"陆华",78,75,90,80,95,88,37},
{179327,"张平",82,80,78,98,84,96,40},
{179324,"赵小怡",76,85,94,57,77,69,44}};//数组不按关键字有序
SSTablest;
inti;
longs;
for(i=0;ir[i].total=r[i].politics+r[i].Chinese+r[i].English+r[i].math
+r[i].physics+
r[i].chemistry+r[i].biology;
CreatSeq(st,r,N);//由数组r产生顺序静态查找表st
printf("准考证号姓名政治语文外语数学物理化学生物总分
\n");
Traverse(st,print);//按顺序输出静态查找表st
printf("请输入待查找人的考号:
");
scanf("%ld",&s);
i=Search_Seq(st,s);//顺序查找
if(i)
print(st.elem[i]);
else
printf("没找到\n");
Destroy(st);
return0;
}
(2)运行结果:
'C:
\UsersYJl,?
X\Documerrts\C-Free\Temp'捽静皂1.exer,
(3)运行结果分析:
运用顺序结构完成查询。
任务二:
哈希表的开放定址法算法。
在输出结果中显示查找成功与查找不成功信息。
解答:
(1)源代码:
#include
#include
#include//malloc()等
#include//INT_MAX等
#include//EOF(=AZ或F6),NULL
#include//atoi()
#include//eof()
#include//floor(),ceil(),abs()
#include//exit()
#include//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#define