二分查找和顺序查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上机实验报告
实验课题:实现对有序数据集合的顺序查找和二分查找,并展示出查找过程
设计思路:
我们可以采用数组有序的保存所有数据,这样便于将数据的有序性和其索引的有序性统一起来,同时也便于查找数据。需要声明的是,我们不使用零下标的项,这样做是为了在顺序查找中优化传统顺序查找算法,具体原因后面会有详细介绍。为此,我们可以设计一个类,私有变量声明为该数组和数组的长度。由于集合中的数据类型未知,所以该类为模板类。
对于公有成员,我们创建六个成员函数,除了构造函数和析构函数,其他四个函数分别用来获取外界传入的数组长度、获取外界传入的数组数据、对数据实现顺序查找、对数据实现二分查找。
这里,我们只重点介绍顺序查找函数和二分查找函数。
对于顺序查找,我们对传统的顺序查找方法进行优化,避开每次对数据索引是否越界进行判断这一步骤。具体做法是:将所查找的元素保存在零下标的项中(这也是零下标闲置的原因),然后按照下标顺序从后向前依次遍历匹配所查找元
素与数组元素。若两者相等,展示出该数组元素,并将其下标值反馈给客户;若两者不相等,展示出该元素,进行下一轮匹配。若最终标记下标达到零下标处,说明未查找到所要查找的元素,则客户反馈该信息。
优化后的顺序查找算法比传统的顺序查找算法减少一半的步骤,原因在于每次无须判断标记下标是否越界,这是该算法优化后的优点。它的缺点是没有利用到数据集合有序这一性质,且查找效率低。
对于二分查找,我们声明三个整型变量low、high和mid 依次标记查找域的上界下标、下界下标和中值下标,其中mid=(low+high)/2。我们在开始的时候将low初始化为1(上文中提到过,我们是从下表为1的位置开始存储数据),将high初始化为len(数组长度),并由此初始化mid的值。对于任意一次查找,将索引为mid的值与所查找的值进行比较。若两者相等,则将该元素的索引值反馈给客户;若所查找的值比索引为mid的值小,则将high的值变为mid-1,进行下一轮的查找;若所查找的值比索引为mid的值大,则将low 的值变为mid+1,进行下一轮查找。若最终low>high,则表明未查找到所要查找的值,将此信息反馈给客户。
该算法是一种效率很高的算法,因为它充分利用到数据集合的有序性,这一优点在数据规模较大时体现的更明显。
实验过程分析:
1.在编码过程中,出现了诸如语句末尾逗号遗漏等低级错误。
2.在对WL类的成员函数编码时,出现了函数声明错误,原因是对模板类的语法不熟,编码较少,对类面向对象这一思想理解不透彻。
3.在编码用户选择菜单等地方时,考虑到了程序的健壮性,添加了异常处理,比以前进步。
源代码:
#include
#include "WL.h"
#define MAX 10000 //定义数组的最大长度
using namespace std;
int main()
{
WL
int num,i,x; //num用来存储数组长度,x存储所查找的值
int a[MAX];
char s;
cout<<"Please input the length of the array:"; //提示用户输入数组长度
cin>>num;
p.getlen(num);
cout<<"Please input each data in order:"; //提示用户依次输入数据,并将其保存在数组中
for(i=1;i<=num;i++)
cin>>a[i];
p.getdata(a,num);
cout< cout<<"Please input the data searched:"; //提示用户输入所查找的值 cin>>x; cout< loop: cout<<"Please choose the way for search:"< cout<<"1. Order_search"< cout<<"2. Binary_search"< cout<<"Please input the figure notation:"; cin>>s; cout< if(s=='1') p.find(x); else if(s=='2') p.binary_search(x); else { cout<<"Operator error!"< goto loop; } return 0; } *********************************************** #ifndef WL_H_INCLUDED #define WL_H_INCLUDED #include #define MAX 10000 using namespace std; template class WL { private: T s[MAX]; //对存储数据的数组进行声明 int len; //对数组长度进行声明 public: WL() {}; ~WL() {} void getlen(int num); //从外界获取数组长度值,并将其传给len