顺序查找
#include <iostream>
using namespace std;
#define Maxsize 100
int SqSearch(int r[],int n,int x) {
for(int i=0; i<n; i++)
if(r[i]==x)
return i;
return -1;
}
int SqSearch2(int r2[],int n,int x) {
int i;
r2[0]=x;
for(i=n; r2[i]!=x; i--);
return i;
}
int main() {
int i,n,x,r[Maxsize],r2[Maxsize+1];
cout<<"请输入元素个数n为:"<<endl;
cin>>n;
cout<<"请依次n个元素:"<<endl;
for(int i=0; i<n; i++) {
cin>>r[i];
r2[i+1]=r[i];
}
cout<<endl;
cout<<"请输入要查找的元素:";
cin>>x;
i=SqSearch2(r2,n,x);
if(i==0)
cout<<"该数列中没有要查找的元素"<<endl;
else
cout<<"要查找的元素在第"<<i<<"位"<<endl;
return 0;
}
二分查找
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int M=100;
int x,n,i;
int s[M];
int BinarySearch(int s[],int n,int x) {
int low=0,high=n-1;
while(low<=high) {
int middle=(low+high)/2;
if(x==s[middle])
return middle;
else if(x>s[middle])
low=middle+1;
else
high=middle-1;
}
return -1;
}
int recursionBS (int s[],int x,int low,int high) {
if(low>high)
return -1;
int middle=(low+high)/2;
if(x==s[middle])
return middle;
else if(x<s[middle])
return recursionBS (s,x,low,middle-1);
else
return recursionBS (s,x,middle+1,high);
}
int main() {
cout<<"该数列中的元素个数n为:";
cin>>n;
cout<<"请依次输入数列中的元素:";
for(i=0; i<n; i++)
cin>>s[i];
sort(s,s+n);
cout<<"排序后的数组为:";
for(i=0; i<n; i++) {
cout<<s[i]<<" ";
}
cout<<endl;
cout<<"请输入要查找的元素:";
cin>>x;
i=recursionBS(s,x,0,n-1);
if(i==-1)
cout<<"该数列中没有要查找的元素"<<endl;
else
cout<<"要查找的元素在第"<<i+1<<"位"<<endl;
return 0;
}
Hash表查找
线性探测和二次探测法
#include<iostream>
#include<string.h>
using namespace std;
const int m = 15;
const int NULLKEY = 0;
int HT[m],HC[m];
int H(int key){
return key%13;
}
int Linedetect(int HT[],int H0,int key,int &cnt){
int Hi;
for(int i = 1; i<m;i++){
cnt++;
Hi = (H0+i)%m;
if(HT[Hi]==NULLKEY){
return Hi;
} else if(HT[Hi]==key){
return Hi;
}
}
return -1;
}
int Seconddetect(int HT[],int H0,int key,int &cnt){
int Hi;
for(int i = 1; i <= m / 2; i++){
int i1 = i*i;
int i2 = -i1;
cnt++;
Hi = (H0+i1)%m;
if(HT[Hi]==NULLKEY){
return Hi;
} else if(HT[Hi]==key){
return Hi;
}
cnt++;
Hi = (H0+i2)%m;
if(Hi<0){
Hi+=m;
}
if(HT[Hi]==NULLKEY){
return Hi;
}else if(HT[Hi]==key){
return Hi;
}
}
return -1;
}
int SearchHash(int HT[],int key){
int H0 = H(key);
int Hi,cnt = 1;
if(HT[H0]==NULLKEY){
return -1;
} else if(HT[H0]==key){
cout<<"查找成功,比较次数:"<<cnt<<endl;
}else{
Hi = Linedetect(HT,H0,key,cnt);
if(HT[Hi]==key){
cout<<"查找成功,比较次数:"<<cnt<<endl;
return Hi;
}else{
return -1;
}
}
}
bool InsertHash(int HT[],int key){
int H0 = H(key);
int Hi = -1,cnt = 1;
if(HT[H0]==NULLKEY){
HC[H0]=1;
HT[H0] = key;
return 1;
} else{
Hi = Linedetect(HT,H0,key,cnt);
if(Hi!=-1 && HT[Hi]==NULLKEY){
HC[Hi] = cnt;
HT[Hi] = key;
return 1;
}
}
return 0;
}
void print(int HT[]){
for(int i = 0;i<m;i++){
cout<<HT[i]<<"\t";
}
cout<<endl;
}
int main()
{
int x;
memset(HT,0,sizeof(HT));
memset(HC,0,sizeof(HC));
cout<<"HT的初始状态:"<<endl;
print(HT);
cout<<"输入12个关键字,存入到哈希表中:"<<endl;
for(int i = 0; i<12;i++){
cin>>x;
if(!InsertHash(HT,x)){
cout<<"创建哈希表失败!"<<endl;
return 0;
}
}
cout<<"输出哈希表:"<<endl;
print(HT);
print(HC);
cout<<"输入要查找的关键字:"<<endl;
cin>>x;
int result = SearchHash(HT,x);
if(result!=-1){
cout<<"在第"<<result+1<<"位置找到"<<endl;
} else{
cout<<"未找到"<<endl;
}
return 0;
}
链地址法