数据结构实验六(二分查找、Hash查找)题目和源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验6:二分查找、Hash查找算法的程序实现
(第十五三周星期三7、8节)
一、实验目的
1 .熟练掌握二分查找算法并能在有序表中进行查找操作。
2. 掌握Hash表的相关算法。
二、实验要求
1.认真阅读和掌握和本实验相关的教材内容。
2.复习顺序表及二叉树的基本操作过程。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验报告。
三、实验内容
1.二分查找又称为折半查找,它要求要查找的顺序表必须是有序表,即表中结点按关键字有序.并且要用顺序存储结构。
基本思想是:首先将给定值key与表中中间位置记录的关键字相比较,若二者相等,则查找成功,否则根据比较的结果确定下次查找的范围是在中间记录的前半部分还是后半部分,然后在新的查找范围内进行同样的查找,如此重复下去,直到在表中找到关键字与给定值相等的记录,或者确定表中没有这样的记录。
编写程序构造一个有序表La,从键盘接收一个关键字key,用二分查找法在La 中查找key,若找到则提示查找成功并输出key所在的位置,否则提示没有找到信息。
2.编写程序实现Hash表的建立、删除、插入以及查找操作。
程序应包含的主要功能函数有:
Hash( ):计算哈希地址
InitialHash( ):初始化哈希表
SearchHash( ):在哈希表中查找关键字
InsertHash( ):向哈希表中插入关键字
DeleteHash( ):删除哈希表中某一关键字
PrintHash ( ):打印输出哈希表
四、思考与提高
如何利用二分查找算法在一个有序表中插入一个元素x,并保持表的有序性?
/*----------------------------------------
* 06-1_二分查找.cpp -- 二分查找的相关操作
* 对二分查找的每个基本操作都用单独的函数来实现
* 水上飘2009年写
----------------------------------------*/
// ds06.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
using namespace std;
typedef int ElemType;
typedef struct {
//数据元素存储空间基址,建表时按实际长度分配,0号单元留空ElemType* elem;
//表的长度
int length;
}SSTable;
//构造一个含n个数据元素的静态查找表ST
void Create_ST(SSTable &ST, int n) {
ST.length = n;
ST.elem = new ElemType[n+1];
ST.elem[0] = 0;
for (ElemType i = 1; i <= n; i++) {
ST.elem[i] = i * i;
}
}
//输出静态查找表
void OutPut_ST(SSTable ST) {
for (int i = 1; i <= ST.length; i++) {
cout << setw(5) << ST.elem[i];
if((i % 5) == 0)
cout << endl;
}
cout << endl;
}
/*在有序表中折半查找等于key的数据元素。若找到,则函数
值为该元素在表中的位置,否则为0.*/
int Search_Bin(SSTable &ST, ElemType key) {
int low = 1, mid;
int high = ST.length; //置区间初值
while(low <= high) {
mid = (low + high) / 2;
if(ST.elem[mid] == key)
return mid; //找到待查元素
else if(key < ST.elem[mid])
high = mid - 1; //继续在前半区间进行查找
else low = mid + 1; //继续在后半区间进行查找
}//while
return 0; //顺序表中不存在待查元素
}
//展示给用户
void show(SSTable &ST){
int m = 1, k;
while(m != 0){
cout << "请输入需要查找的元素(要退出,请输入‘0’):";
cin >> m;
k = Search_Bin(ST, m);
if(k == 0)
cout << "不存在该元素。" << endl;
else
cout << "该元素是表中第" << k << "的一个元素。" << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
SSTable ST;
int n;
cout << "请输入静态查找表的元素个数:";
cin >> n;
Create_ST(ST, n);
//OutPut_ST(ST);
OutPut_ST(ST);
show(ST);
cin.get();
cin.get();
return 0;
}