搜索
基本概念
搜索(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);
}
}
二分搜索
二分搜索法(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