赞
踩
一、 实验目的
(1)领会各种查找算法的过程和算法设计。
(2)掌握查找算法解决实际问题。
二、 实验要求
(1)编写一个程序exp8-1.cpp, 按提示输入10个任意的整形数据(无序),再输入一个待查找的数据,采用顺序查找方法,如果查找成功,返回该数据所在的位置(逻辑序号)。 如果查找不成功,给出一定的提示。
(2)编写一个程序exp8-2.cpp,输出在顺序表(1,2,3,4,5,6,7,8,9,10)中采用折半查找方法查找关键字9的过程。
三、实验环境
Windows+DEV C++( 或者其他编译工具)
四、实验步骤及结果
1.类型声明
(1)
顺序查找(无序):
- typedef int KeyType;//定义关键字类型为int
-
- typedef char InfoType[10];
-
- typedef struct {
-
- KeyType Key;//关键字项
-
- InfoType data;//其他数据项,类型为InfoType
-
- } NodeType; //查找元素类型
-
- typedef NodeType SeqList[MAXSIZE];
(2)
- typedef int KeyType;//定义关键字类型为int
-
- typedef char InfoType[10];
-
- typedef struct {
-
- KeyType key;//关键字项
-
- InfoType data;//其他数据项,类型为InfoType
-
- } NodeType; //查找元素类型
-
- typedef NodeType SeqList[MAXL];//顺序表类型
2.各类查找算法的实现
(1)
顺序查找(无序):
- int Search(SeqList R,int n,KeyType k) {
-
- int i=0;
-
- while(i<n&&R[i].Key!=k) {
-
- i++;
-
- }
-
- if(i>=n)
-
- return -1;
-
- else
-
-
-
- return i;
-
- }
(2)
折半查找(递归):
- int BinSearch(SeqList R,KeyType k,int low,int high,int count)//折半查找算法(递归)
-
- {
-
- int mid;
-
- if(low<=high)
-
- {
-
- mid=(low+high)/2;
-
- printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
-
- if(R[mid].key==k)//查找成功返回
-
- return mid;
-
- else if(R[mid].key>k) //继续在R[low...mid-1]中查找
-
- BinSearch(R,k,low,mid-1,count);
-
- else
-
- BinSearch(R,k,mid+1,high,count);//继续在R[mid+1...high]中查找
-
- }
-
- else return -1;
-
- }
3.主程序设计及完成实验要求中的功能
(1)
顺序查找(无序):
- int main() {
-
- SeqList R;
-
- int n=10;
-
- KeyType k = 9;
-
- printf("输入序列内容(十个不同整型数字):");
-
- int i;
-
- for(i=0;i<10;i++)
-
- {
-
- scanf("%d",&R[i].Key);
-
- }
-
- printf("序列为:");
-
- for(i=0;i<n;i++)
-
- {
-
- printf("%d,",R[i].Key);
-
- }
-
- printf("\n请输入需要查找的数字为:");
-
- scanf("%d",&k);
-
- printf("需要搜索的数字为%d",k);
-
- if((i =Search(R,n,k))!=-1)
-
- printf("\n%d在序列的第%d位置",k,i);
-
- else
-
- printf("\n元素%d不在序列中\n",k);
-
- printf("\n");
-
- }
(2)
折半查找(递归):
- int main()
-
- {
-
- SeqList R;
-
- int i;
-
- int n=10;
-
- KeyType k = 9;
-
- int a[]={1,2,3,4,5,6,7,8,9,10};
-
- for(i=0;i<n;i++)//建立顺序表
-
- R[i].key=a[i];
-
- printf("用递归方法:\n");
-
- if((i =BinSearch(R,k,0,9,0))!=-1)
-
- printf("元素%d的位置是%d\n",k,i);
-
- else
-
- printf("元素%d不在表中\n",k);
-
- }
exp8-1:
- #include <stdio.h>
- #define MAXSIZE 100
- typedef int KeyType;//定义关键字类型为int
- typedef char InfoType[10];
- typedef struct {
- KeyType Key;//关键字项
- InfoType data;//其他数据项,类型为InfoType
- } NodeType; //查找元素类型
- typedef NodeType SeqList[MAXSIZE];
- int Search(SeqList R,int n,KeyType k) {
- int i=0;
- while(i<n&&R[i].Key!=k) {
- i++;
- }
- if(i>=n)
- return -1;
- else
-
- return i;
- }
- int main() {
- SeqList R;
- int n=10;
- KeyType k = 9;
- printf("输入序列内容(十个不同整型数字):");
- int i;
- for(i=0;i<10;i++)
- {
- scanf("%d",&R[i].Key);
- }
- printf("序列为:");
- for(i=0;i<n;i++)
- {
- printf("%d,",R[i].Key);
- }
- printf("\n请输入需要查找的数字为:");
- scanf("%d",&k);
- printf("需要搜索的数字为%d",k);
- if((i =Search(R,n,k))!=-1)
- printf("\n%d在序列的第%d位置",k,i);
- else
- printf("\n元素%d不在序列中\n",k);
- printf("\n");
- }
exp8-2:
- #include <stdio.h>
- #define MAXL 100
- typedef int KeyType;//定义关键字类型为int
- typedef char InfoType[10];
- typedef struct {
- KeyType key;//关键字项
- InfoType data;//其他数据项,类型为InfoType
- } NodeType; //查找元素类型
- typedef NodeType SeqList[MAXL];//顺序表类型
- int BinSearch(SeqList R,KeyType k,int low,int high,int count)//折半查找算法(递归)
- {
- int mid;
- if(low<=high)
- {
- mid=(low+high)/2;
- printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
- if(R[mid].key==k)//查找成功返回
- return mid;
- else if(R[mid].key>k) //继续在R[low...mid-1]中查找
- BinSearch(R,k,low,mid-1,count);
- else
- BinSearch(R,k,mid+1,high,count);//继续在R[mid+1...high]中查找
- }
- else return -1;
- }
- int main()
- {
- SeqList R;
- int i;
- int n=10;
- KeyType k = 9;
- int a[]={1,2,3,4,5,6,7,8,9,10};
- for(i=0;i<n;i++)//建立顺序表
- R[i].key=a[i];
- printf("用递归方法:\n");
- if((i =BinSearch(R,k,0,9,0))!=-1)
- printf("元素%d的位置是%d\n",k,i);
- else
- printf("元素%d不在表中\n",k);
- }
4.实验结果截图
(1)
顺序查找(无序):
(2)
折半查找(递归):
如需源文件,请私信作者,无偿
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。