实验五查找及排序讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五 查找及排序
实验课程名: 数据结构与算法
一、实验目的及要求
1、掌握查找的不同方法,并能用高级语言实现查找算法。
2、熟练掌握顺序表的查找方法和有序顺序表的折半查找算法。
3、掌握常用的排序方法,并能用高级语言实现排序算法。
4、深刻理解排序的定义和各种排序方法的特点,并能加以灵活运用。
5、了解各种方法的排序过程及依据的原则,并掌握各种排序方法的时间复杂度的分析方法。
二、实验内容
任务一:顺序表的顺序查找。 有序表的折半查找。
完成下列程序,该程序实现高考成绩表(如下表所示)的顺序查找,在输出结果中显示查找成功与查找不成功信息。
解答:
(1)源代码:#include
#include
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h 中已定义OVERFLOW 的值为3,故去掉
此行
typedef int Status; // Status 是函数的类型,其值是函数结果状态代码,
如OK 等
typedef int Boolean; // Boolean 是布尔类型,其值是TRUE 或FALSE #define MAX_LENGTH 100 #include
准考证号 姓名 各科成绩 总分
政治
语文 外语 数学 物理 化学 生物 179328 何芳芳 85 89 98 100 93 80 47 592 179325 陈红 85 86 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
#include
#include
#include
#include
#include
#include
#include
#include
#include
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE
#define N 5 // 数据元素个数
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef long KeyType; // 设关键字域为长整型
#define key number // 定义关键字为准考证号
struct ElemType // 数据元素类型(以教科书图9.1高考成绩为例)
{
long number; // 准考证号,与关键字类型同
char name[9]; // 姓名(4个汉字加1个串结束标志)
int politics; // 政治
int Chinese; // 语文
int English; // 英语
int math; // 数学
int physics; // 物理
int chemistry; // 化学
int biology; // 生物
int total; // 总分
};
typedef struct {
ElemType *elem; // 数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length; // 表长度
}SSTable;
void Creat_Seq(SSTable &ST,ElemType r[],int n)
{ // 操作结果:由含n个数据元素的数组r构造静态顺序查找表ST
int i;
ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType)); // 动态生成n+1个数据元素空间(0号单元不用)
if(!ST.elem)
exit(ERROR);
for(i=1;i<=n;i++)
ST.elem[i]=r[i-1]; // 将数组r的值依次赋给ST
ST.length=n;
}
void Ascend(SSTable &ST)
{ // 重建静态查找表为按关键字非降序排序
int i,j,k;
for(i=1;i { k=i; ST.elem[0]=ST.elem[i]; // 待比较值存[0]单元 for(j=i+1;j<=ST.length;j++) if LT(ST.elem[j].key,ST.elem[0].key) { k=j; ST.elem[0]=ST.elem[j]; } if(k!=i) // 有更小的值则交换 { ST.elem[k]=ST.elem[i]; ST.elem[i]=ST.elem[0]; } } } void Creat_Ord(SSTable &ST,ElemType r[],int n) { // 操作结果:由含n个数据元素的数组r构造按关键字非降序查找表ST Creat_Seq(ST,r,n); // 建立无序的查找表ST Ascend(ST); // 将无序的查找表ST重建为按关键字非降序查找表 } Status Destroy(SSTable &ST) { // 初始条件:静态查找表ST存在。操作结果:销毁表ST free(ST.elem); ST.elem=NULL; ST.length=0; return OK;