搜索

搜索

基本概念

搜索(search)是各种数据结构中的一种常见运算.
搜索是在给定的数据集合中,寻找符合特定条件的数据,用来搜索的这个特定条件称之为键值.
按数据集合所含数据量的大小来分,搜索可分内部搜索和外部搜索.
当数据量较小,可以直接将它载入内存中进行搜索,称这种搜索为内部搜索.
当数据量较大,无法一次将它载入内存进行搜索,
需要使用辅助存储器来分批次处理,称这种搜索为外部搜索 

搜索表:由同一类型数据所组成的集合.
关键字:可唯一标识数据的数据项.
搜索:在搜索表查找关键字值与键值相同的数据.
成功搜索:在搜索表查找到关键字值与键值相同的数据.
不成功搜索:在搜索表未查找到关键字值与键值相同的数据.
最大搜索长度:在成功搜索中,关键字值与键值进行比较的最大次数. 
平均搜索长度(average search length):在成功搜索中,关键字值与键值的平均比较次数.
ASL(n) = sum(p(i)c(i))  
n为数据量,p(i)是取第i个数据的概率,c(i)是搜索第i个数据所需的比较次数.

顺序搜索

循序搜索法(linear search)从搜索表的一段开始循序扫描,
依次将搜索表中的结点关键字值和键值进行比较,
若两者相等,则搜索成功;
若扫描结束,还没有找到与键值相等的关键字值,则搜索失败.
#include<iostream>
#include<ctime>
#include<stdlib.h>
using namespace std;
#define n 81
void Create(int *data){
	for (int i=0;i<n;i++)
		data[i]=rand()%150+1;
}	 
void Display(int *data){
	int i,ColNum=0;
	for(i=0;i<n;i++){
		cout<<data[i]<<"\t";
		ColNum++;
		if(ColNum==9){
			ColNum=0;
			cout<<endl;
		}
	}
	cout<<endl;
}

void LinearSearch(int *data,int key){
	int flag=0;
	for(int i=0;i<n;i++)
		if(data[i]==key){
			cout<<"在第"<<i<<"个位置,找到"<<key<<endl;
			flag=1; 
		}
	if(flag==0)
		cout<<"没有找到"<<key<<endl; 
}

int main(){
	int i,key,data[n];
	srand(time(NULL));//设置随机数发生器种子
	Create(data);
	cout<<"搜索数组"<<endl;
	Display(data);
	while(1){
		cout<<"请输入搜索值(1--150),输入-1退出搜索:"<<endl;
		cin>>key;
		if(key==-1) break;
		LinearSearch(data,key); 
	} 
} 

C++中随机函数rand()和srand()的用法请参考

二分搜索

二分搜索法(binary search)只使用于搜索数据已被排序的情况.
假设搜索数据是升序的,二分搜索法是将数据分成两等份,
再比较键值与中间值的大小,如果键值小于中间值,
可确定要搜索的数据为前半部分,否则为后半部分.
如此进行下去,直到搜索成功或不成功.
#include<iostream>
#include<ctime>
#include<stdlib.h>
using namespace std;
#define  N  81

void Create(int *data,int n){
	for (int i=0;i<n;i++)
		data[i]=rand()%150+1;
}	 
void Display(int *data,int n){
	int i,ColNum=0;
	for(i=0;i<n;i++){
		cout<<data[i]<<"\t";
		ColNum++;
		if(ColNum==9){
			ColNum=0;
			cout<<endl;
		}
	}
	cout<<endl;
}

void LinearSearch(int *data,int key,int n){
	int flag=0;
	for(int i=0;i<n;i++)
		if(data[i]==key){
			cout<<"在第"<<i<<"个位置,找到"<<key<<endl;
			flag=1; 
		}
	if(flag==0)
		cout<<"没有找到"<<key<<endl; 
}

//冒泡排序
void Bubble (int *data,int n){
	int i,j,index;
	for(i=1;i<n;i++){
		for(j=n-1;j>i-1;j--){
			if(data[j]<data[j-1]){
				index=data[j];
				data[j]=data[j-1];
				data[j-1]=index;				
			}	
		}
		//cout<<"第"<<setw(2)<<i<<"趟排序";Display(data,n); 
	}
}

void BinarySearch(int *data,int key,int n){  //数组data,键值key,数组长度n 
	int z,mid,y,flag;// 左中右 标识
	z=0;y=n-1;
	if(key<data[z]||key>data[y]){
		cout<<"键值超出界,无法找到"<<endl;
		return; 
	}
	flag=0;
	while(z<=y){
		mid=(z+y)/2;
		if(key<data[mid])
			y=mid-1;
		else if(key>data[mid])
			z=mid+1;
		else{
			cout<<"在第"<<mid<<"个位置,搜索到"<<key<<endl;
			flag=1;
			break; 
		}
	}
	if(flag==0)
		cout<<"没有搜索到"<<endl; 
}

int main(){
	int i,key,data[N];
	srand(time(NULL));//设置随机数发生器种子
	Create(data,N);
	cout<<"搜索数组"<<endl;
	Bubble(data,N); 
	Display(data,N);
	while(1){
		cout<<"请输入搜索值(1--150),输入-1退出搜索:"<<endl;
		cin>>key;
		if(key==-1) break;
	//	LinearSearch(data,key,N); 
		BinarySearch(data,key,N);
	} 
} 

二叉搜索树

二叉搜索树就是排序二叉树.
二叉搜索树的创建,插入,查找过程实现(C++)请查看

写于2020-10-28

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值