二分(binary search)& 哈希(hash search)

#include<iostream> using namespace std; int recursive_bin_search(int a[],int low,int high,int key,int n){ int mid=(low+high)/2; if(a[mid]==key)return mid; else if(a[mid]<key)recursive_bin_search(a,mid+1,high,key,n); else if(a[mid]>key)recursive_bin_search(a,low,high-1,key,n); } int bin_search(int a[],int key,int n){ int find=0,low=0,high=n-1,mid,i; while(low<=high){ mid=(low+high)/2; if(a[mid]>key){ high=mid-1; } else if(a[mid]<key){ low=mid+1; } else{ find=1; i=mid; break; } } if(find==0) return -1; else return i; } int main(){ int n=10; int a[10]={1,2,3,4,5,6,7,8,9}; int tmp=bin_search(a,9,n); if(tmp==0){ cout<<"Can not find!"<<endl; } else{ cout<<"Index:"<<tmp<<endl; } cout<<"recursive:**************"<<endl; cout<<recursive_bin_search(a,0,9,9,10)<<endl; return 0; } #include<stdio.h> const int MAXSIZE=100; const int NULLKEY=-1; const int DELKEY=-2; struct HashTable{ int key; int count; }; void InsertHT(HashTable ha[],int &n,int k,int p){ int i,adr; adr=k%p; if(ha[adr].key==NULLKEY || ha[adr].key==DELKEY){//put into hash table directly ha[adr].key=k; ha[adr].count=1; } else{ i=1; do{ adr=(adr+1)%p; ++i; }while(ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY); ha[adr].key=k; ha[adr].count=i; } ++n; } void CreateHT(HashTable ha[],int x[],int n,int m,int p){ int i,n1=0; for(i=0;i<m;++i){ ha[i].key=NULLKEY; ha[i].count=0; } for(i=0;i<n;++i){ InsertHT(ha,n1,x[i],p); } } int SearchHT(HashTable ha[],int p,int k){ int i=0,adr; adr=k%p; while(ha[adr].key!=NULLKEY && ha[adr].key!=k){ ++i; adr=(adr+1)%p; } if(ha[adr].key==k) return adr; else return -1; } int DeleteHT(HashTable ha[],int p,int k,int &n){ int adr; adr=SearchHT(ha,p,k); if(adr!=-1){ ha[adr].key=DELKEY; n--; return 1; } else return 0; } void DispHT(HashTable ha[],int n,int m){ double avg=0; int i; printf("Hash address:/t"); for(i=0;i<m;++i) printf("%3d",i); printf("/n"); printf("Hash Key:/t"); for(i=0;i<m;++i){ if(ha[i].key==NULLKEY || ha[i].key==DELKEY){ printf(" "); } else printf("%3d",ha[i].key); } printf("/n"); printf("Search Time:/t"); for(i=0;i<m;++i){ if(ha[i].key==NULLKEY || ha[i].key==DELKEY){ printf(" "); } else{ printf("%3d",ha[i].count); } } printf("/n"); for(i=0;i<m;++i){ if(ha[i].key!=NULLKEY && ha[i].key!=DELKEY){ avg=avg+ha[i].count; } } avg=avg/n; printf("ASL(%d):=%g/n",n,avg); } int main(){ int x[]={16,74,60,43,54,90,46,31,29,88,77}; int n=11,m=13,p=13,i,k=29; HashTable ha[MAXSIZE]; CreateHT(ha,x,n,m,p); printf("/n"); DispHT(ha,n,m); i=SearchHT(ha,p,k); if(i!=-1) printf("ha[%d].key=%d/n",i,k); else printf("Can not find%d/n",k); k=77; printf("Delete KEY %d/n",k); DeleteHT(ha,p,k,n); DispHT(ha,n,m); i=SearchHT(ha,p,k); if(i!=-1) printf("ha[%d].key=%d/n",i,k); else printf("Can not find %d/n",k); printf("Insert Key %d/n",k); InsertHT(ha,n,k,p); DispHT(ha,n,m); printf("/n"); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值