(完整版)冒泡排序和二分查找实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
冒泡排序和二分查找实验报告
一实验题目: 基于冒泡排序的二分查找
二实验要求:
2.1: 输出在顺序表中利用二分的方法查找关键字 9 的过程。
2.2:实现冒泡排序的过程,并输出{9,8,7,6,5,4,3,2,1,0}的过程三实验内容:
3.1 动态查找表的抽象数据类型:
ADT DynamicSearchTable {
数据对象D:D是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标识数据元素的关键字
数据关系R:数据元素同属一个集合。
基本操作 P:
InitDSTable(&DT);
操作结果:构造一个空的动态查找表DT。
DestroyDSTable(&DT)
初始条件:动态查找表DT存在。
操作结果:销毁动态查找表DT。
SearchDSTable(DT,key);
初始条件:动态查找表DT存在,key为和关键字类型相同的给定值。
操作结果:若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。
InsertDSTable(&DT,e);
初始条件:动态查找表DT存在,e为待插入的数据元素。
操作结果:若DT中不存在其关键字等于e.key的数据元素,则插入e到DT。
DeleteDSTable(&DT,key);
初始条件:动态查找表DT存在,key为和关键字类型相同的给定值。
操作结果:若DT中存在其关键字等于key的数据元素,则删除之。
TraverseDSTable(DT,visit());
初始条件:动态查找表DT存在,visit是对结点操作的应用函数。
操作结果:按某种次序对DT的每个结点调用函数visit()一次且至多一次,一旦visit() 失败,则操作失败。
}ADT DynamicSearchTable
3.2存储结构的定义;
///二分查找
#define maxn 100
typedef struct
{
int key;
char data[10];
}NodeType;
typedef NodeType SeqList[maxn];
///冒泡排序
#define maxn 20
typedef struct
{
int key;
char data[10];
} RecType;
3.3基本操作实现:
int BinSearch(SeqList R, int n ,int k)
{
int l = 0, r = n - 1,mid , count = 0;
while(l <= r)
{
mid = (l + r)/2;
printf(" 第%d 次比较:在[ %d , %d ] 中比较元素R[%d]: %d\n",++count,l,r,mid,R[mid].key);
if(R[mid].key == k)
{
return mid;
}
else if(R[mid].key > k)
{
r = mid - 1;
}
else
{
l = mid + 1;
}
}
return -1;
}
void BubbleSort(RecType R[],int n)
{
int i, j, k;
RecType temp;
for(i = 0;i < n - 1; ++i)
{
for(j = n - 1; j > i; --j)
{
if(R[j].key < R[j - 1].key)
{
temp = R[j];
R[j] = R[j - 1];
R[j - 1] = temp;
}
}
printf("i = %d ,冒出的最小关键字: %d ,结果为:",i, R[i].key); for(k = 0;k < n; ++k)
printf("%2d",R[k].key);
printf("\n");
}
}
3.4解题思路:
二分查找:因为原本便是顺序表,是递增序列,所以在一个区间中,我们只要每次判断中间节点和被查找的关键字的大小关系,就可以判断被查找的节点在那一段区
间了,然后再进行二分即可。
冒泡排序:通过一次一次的交换,把无序序列中关键字最小的节点的值交换到前面即可。
3.5解题过程:
实验源代码如下:
3.5.1二分查找
#include
#define maxn 100
typedef struct
{
int key;
char data[10];
}NodeType;
typedef NodeType SeqList[maxn];
int BinSearch(SeqList R, int n ,int k)
{
int l = 0, r = n - 1,mid , count = 0;
while(l <= r)
{
mid = (l + r)/2;
printf(" 第%d 次比较:在[ %d , %d ] 中比较元素R[%d]: %d\n",++count,l,r,mid,R[mid].key);
if(R[mid].key == k)
{
return mid;