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

#include<iostream>
using namespace std;
//*****************************************//
//实验内容 ,实现基于有序顺序表的折半搜索。 //
//*****************************************//

//SeqList.h
typedef int keytype;//keytype =int
typedef 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);t
	int 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的初始值为n
	int 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;
	SeqList	R;
	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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值