查找技术:有序表的对分查找(折半查找)类

一 查找技术相关总结:

1.顺序查找:(1)如果线性表为无序表(即表中元素的排序是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找;(2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。

2.有序表的对分查找:条件:顺序存储的有序表。

3.分块查找(又称索引顺序查找):分块有序表结构分为两部分(1)线性表本身采用顺序存储结构(2)在建立一个索引表,在索引表中,对线性表的每个子表建立一个索引结点,每个结点包括两个域:一个数据域,用于存放对应子表中的最大元素值;二是指针域,用于指示对应子表的第一个元素在整个线性表中的序号。显然,索引表关于数据域是有序的。

4.二叉排序树查找

5.多层索引树查找(B-和B+树)

二 对分查找类:

1.对分查找类SL_Link.h

#include<iostream.h>
template <class T>
class SL_List
{
	private:
		int mm;//存储空间容量
		int nn;//表长度
		T *v;
	public:
		SL_List(){mm=0;nn=0;return;}//只定义对象
		SL_List(int);//顺序有序表初始化(指定存储空间容量)
		int search_SL_List(T);//顺序有序表查找
		int insert_SL_List(T);//顺序有序表插入
		int delete_SL_List(T);//顺序有序表删除
		void prt_SL_List();//顺序输出有序表中元素与有序表长度
		friend SL_List operator +(SL_List &,SL_List &);//有序表合并
};
//顺序有序表初始化(指定存储空间容量)
template <class T>
SL_List<T>::SL_List(int m)
{
	mm=m;
	v=new T[mm];
	nn=0;
	return;
}
//顺序有序表查找
template <class T>
int SL_List<T>::search_SL_List(T x)
{
	int i,j,k;
	i=1;j=nn;
	while(i<=j)
	{
		k=(i+j)/2;
		if(v[k-1]==x)
			return(k-1);
		if(v[k-1]>x)
			j=k-1;
		else i=k+1;
	}
	return -1;
}
//顺序有序表插入
template <class T>
int SL_List<T>::insert_SL_List(T x)
{
	int k;
	if(nn==mm)
	{
		cout<<"上溢!"<<endl;return -1;
	}
	k=nn-1;
	while(v[k]>x)
	{
		v[k+1]=v[k];
		k=k-1;
	}
	v[k+1]=x;
	nn=nn+1;
	return 1;
}
//顺序有序表删除
template <class T>
int SL_List<T>::delete_SL_List(T x)
{
	int i,k;
	k=search_SL_List(x);
	if(k>=0)
	{
		for(i=k;i<nn-1;i++)
			v[i]=v[i+1];
			nn=nn-1;	
	}
	else
		cout<<"没有这个元素!"<<endl;
	return k;
}


//顺序输出有序表中元素与有序表长度

template <class T>
void SL_List<T>::prt_SL_List()
{
	int i;
	cout<<"nn="<<nn<<endl;
	for(i=0;i<nn;i++)
		cout<<v[i]<<endl;
	return;

}
//有序表合并
template <class T>
SL_List<T> operator +(SL_List<T> &s1,SL_List<T> &s2)
{
	int k=0,i=0,j=0;
	SL_List<T> s;
	s.v=new T[s1.nn+s2.nn];
	while((i<s1.nn)&&(j<s2.nn))
	{
		if(s1.v[i]<=s2.v[j])
		{
			s.v[k]=s1.v[i];i=i+1;
		}
		else
		{
			s.v[k]=s2.v[j];j=j+1;
		}
		k=k+1;
	}
	if(i==s1.nn)
	{
		for(i=j;i<s2.nn;i++)
		{
			s.v[k]=s2.v[i];k=k+1;
		}
	}
	else
		for(j=i;j<s1.nn;j++)
		{	s.v[k]=s1.v[j];k=k+1;
		}
	
	s.nn=s1.nn+s2.nn;
	s.mm=s1.mm+s2.mm;
	return (s);
}


2.具体事例

#include "SL_List.h"
int main()
{
	int k;
	double a[5]={1.5,5.5,2.5,4.5,3.5};
	double b[7]={1.0,7.5,2.5,4.0,5.0,4.5,6.5};
	SL_List<double> s1(20);//建立容量为20 长度为5的有序表对象s1
	SL_List<double> s2(30);//建立容量为30 长度为7的有序表对象s2
	for(k=0;k<5;k++)//依次插入有序表的元素
		s1.insert_SL_List(a[k]);
	for(k=0;k<7;k++)
		s2.insert_SL_List(b[k]);
	cout<<"输出有序表对象s1:"<<endl;
	s1.prt_SL_List();
	cout<<"输出有序表对象s2:"<<endl;
	s2.prt_SL_List();
	SL_List<double> s3;
	s3=s1+s2;  //有序表合并
	cout<<"输出合并后的有序表对象s3:"<<endl;
	s3.prt_SL_List();
	s3.delete_SL_List(a[0]);
	s3.delete_SL_List(b[0]);
	s3.delete_SL_List(100.0);
	cout<<"输出删除后的有序表s3:"<<endl;
	s3.prt_SL_List();
	return 0;



}


3.实验结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值