基于有序顺序表的折半搜索

来源:互联网 发布:中国教育网络培训学院 编辑:程序博客网 时间:2024/05/11 15:46
#include<iostream>using namespace std;//*****************************************////实验内容 ,实现基于有序顺序表的折半搜索。 ////*****************************************////SeqList.htypedef int keytype;//keytype =inttypedef struct{keytype key;}RecNode;class SeqList{public:SeqList (int MaxListSize=100);~SeqList(){delete[] data;}void CreateList(int n);//顺序表输入int SeqSearch(keytype k);int SeqSearch1(keytype k);tint BinSearch(keytype k,in low,int high);friend void BinInsert(SeqList &R,keytype x);//,infoType y);void PrintList();private:int length;//实际表长int MaxSize;//最大表长RecNode *data;//一维动态数组};SeqList::SeqList(int MaxListSize){//构造函数MaxSize=MaxListSize;data=new RecNode[MaxSize++];length=0;}void SeqList::CreateList(int n){for (int i=1;i<=n;i++)cin>>data[i].key;length=n;}void SeqList::PrintList(){//表输出for (int i=1;i<=length;i++)cout<<data[i].key<<" ";cout<<endl;}int SeqList::SeqSearch(keytype k){//R[0]作为哨兵,用R[0].key==k作为循环下界的终结条件data[0].key=k;//设置哨兵int i=length;//从后向前扫描while(data[i].key!=k)i--;return i;}int SeqList::SeqSearch1(keytype k){//有序表的顺序查找法int i=length;while (data[i].key>k){i--;}if (data[i].key==k){return i;}return 0;}int SeqList::BinSearch(keytype k,int low,int high){//在区间R[low~hight]内二分递归查找关键字值等于k的记录//low的初始值为1,high的初始值为nint mid;while (low<=high){mid=(low+high)/2;if (data[mid].key==k)return mid;//查找成功,返回其下标if (data[mid].key>k)high=mid-1;else low=mid+1;}return 0;}void BinInsert(SeqList &R,keytype x){int low=1,high=R.length,mid,inspace,i;int find=false;while (low<=high&&!find){mid=(mid+high)/2;if (x<R.data[mid].key)high=mid-1;else if (x>R.data[mid].key)low=mid+1;else find=true;}if (find)inspace=mid;else inspace=low;for (i=R.length;i>=inspace;i--)R.data[i+1]=R.data[i];R.data[inspace].key=x;R.length++;}


//main.cpp#include "SeqList.h"void main(){int i=0;SeqListR;R.CreateList(11);R.PrintList();for (int m=43;m<50;m=m+5){i=R.SeqSearch1(m);if (i!=0)cout<<"找到"<<m<<",位置在"<<i<<"处。\n";else cout<<"没有找到"<<m<<"。\n";}}


0 0
原创粉丝点击