查找和排序算法的实现(实验七)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七查找和排序算法的实现
一.实验目的及要求
(1)学生在实验中体会各种查找和内部排序算法的基本思想、适用场合,理解开发高效算法的可能性和寻找、构造高效算法的方法。

(2)掌握运用查找和排序解决一些实际应用问题。

二.实验内容:
(1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。

(2)编程实现一种内部排序算法(如插入排序、快速排序等)。

三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)
(1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。

➢程序代码:
折半查找:
头文件:
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define maxlength 20
typedef int ElemType;
typedef struct{
ElemType key;
ElemType other;
}card;//每条记录包含的数据项
typedef struct{
card r[maxlength];
int length;
}SSTable;//一张表中包含的记录容量
void Create(SSTable &L);
int Search(SSTable L,int elem);
功能函数:
#include"1.h"
#include"stdio.h"
void Create(SSTable &L)
{
printf("新的线性表已经创建,请确定元素个数(不超过20)\n");
scanf("%d",&L.length);
printf("请按递增序列输入具体的相应个数的整数元素(空格隔开)\n");
for(int i=0;i<L.length;i++)
{
scanf("%d",&L.r[i].key);
}
}
int Search(SSTable L,int elem)
{
if(L.r[L.length-1].key<elem||L.r[0].key>elem)
{
printf("表中没有该元素(不在范围内)\n");
return 0;
}
int low=0,high=L.length-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(EQ(L.r[mid].key,elem)){printf("该元素在第%d位\n",mid+1); return 0;}
else if(LT(elem,L.r[mid].key))
{
high=mid-1;
}
else
{
low=mid+1;
}
}
printf("表中没有该元素(不在范围内)\n");
return 0;
}
主函数:
#include"stdio.h"
#include"1.h"
int main()
{
SSTable L;
Create(L);
printf("\n");
printf("此时的线性表元素:\n");
for(int a=0;a<L.length;a++)
{
printf("%d ",L.r[a].key);
}
printf("\n");
printf("\n");
int elem;
do
{
printf("请输入要查找的元素(输入000表示结束程序)\n");
scanf("%d",&elem);
if(elem!=000)
{
Search(L,elem);
}
}while(elem!=000);
return 0;
}
➢运行结果:
(2)编程实现一种内部排序算法(如插入排序、快速排序等)。

程序代码部分:
直接插入排序
头文件:
#define maxlength 20//最大数据容量
#define OK 1
typedef int Status;
typedef int Other;
typedef int KeyType;
typedef struct{
KeyType key;
Other data;
}Red;
typedef struct{
Red r[maxlength+1];//加了个哨兵的位置
int length;//当前数据个数
}SqList;
Status Init(SqList &L);
Status Insertsort(SqList &L);
功能函数:
#include"stdio.h"
#include"1.h"
Status Init(SqList &L)
{
printf("新的线性表以创建,请确定元素个数(不超过20)\n");
scanf("%d",&L.length);
printf("请输入具体的相应个数的整数元素(空格隔开)\n");
for(int i=1/*将哨兵的位置【0】空出来*/;i<L.length+1;i++)
{
scanf("%d",&L.r[i].key);
}
return OK;
}
Status Insertsort(SqList &L)
{
for(int i=2;i<L.length+1;i++)
{
L.r[0]=L.r[i];//交换的应该是该位置记录的完整数据项,而不仅仅是数据项中的一个key
for(int j=i;j>0&&L.r[0].key<L.r[j-1].key/*这里是依据记录中的数据项key来排序的,所以比较的是key,而不是一条记录的所有数据项*/;j--)
{
L.r[j]=L.r[j-1];
}
L.r[j]=L.r[0];
}
return OK;
}
主函数:
#include"stdio.h"
#include"1.h"
int main()
{
SqList L;
Init(L);
printf("\n");
printf("排序前的线性表元素:\n");
for(int a=1;a<L.length+1;a++)
{
printf("%d ",L.r[a].key);
}
printf("\n");
printf("\n");
Insertsort(L);
printf("排序后的线性表元素:\n");
for(int b=1;b<L.length+1;b++)
{
printf("%d ",L.r[b].key);
}
printf("\n");
return 0;
}
快速排序
头文件:
#define maxlength 20//最大数据容量
#define OK 1
typedef int Status;
typedef int Other;
typedef int KeyType;
typedef struct{
KeyType key;
Other data;
}Red;
typedef struct{
Red r[maxlength+1];//加了个哨兵的位置
int length;//当前数据个数
}SqList;
void Init(SqList &L);
Status Partition(SqList &L,int low,int high);
void QSort(SqList &L,int low,int high);
功能函数:
#include"stdio.h"
#include"1.h"
void Init(SqList &L)
{
printf("新的线性表以创建,请确定元素个数(不超过20)\n");
scanf("%d",&L.length);
printf("请输入具体的相应个数的整数元素(空格隔开)\n");
for(int i=1/*将存放枢轴中关键字所在记录完整信息的位置【0】空出来*/;i<L.length+1;i++)
{
scanf("%d",&L.r[i].key);
}
}
Status Partition(SqList &L,int low,int high)
{
int pivotkey;
pivotkey=L.r[low].key;//用第一条记录的关键字作枢轴
L.r[0]=L.r[low];//存放作为枢轴的关键字所在记录的完整信息
while(low<high)
{
while(low<high&&L.r[high].key>=pivotkey){high--;}//从右端往左
L.r[low]=L.r[high];
while(low<high&&L.r[low].key<=pivotkey){low++;}//从左端往右
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QSort(SqList &L,int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);
}
}
主函数:
#include"stdio.h"
#include"1.h"
int main()
{
SqList L;
Init(L);
printf("\n");
printf("排序前的线性表元素:\n");
for(int a=1;a<L.length+1;a++)
{
printf("%d ",L.r[a].key);
}
printf("\n");
printf("\n");
printf("请输入无序子列的开始和结束位置(有序子列不用管)\n");
int low,high;
scanf("%d %d",&low,&high);
QSort(L,low,high);
printf("排序后的线性表元素:\n");
for(int b=1;b<L.length+1;b++)
{
printf("%d ",L.r[b].key);
}
printf("\n");
return 0;
➢运行结果:
四.实验结果的分析与评价(该部分如不够填写,请另加附页)
1.快速排序利用了递归的思想;
2.折半查找使用前提为:数列有序
注:实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。

相关文档
最新文档