编程珠玑第十三章----查找
2012-07-27 13:17 javaspring 阅读(162) 评论(0) 编辑 收藏 举报1、顺序查找
int find1(int *array,int n,int val) { if (n<=0) { return -1; } for (int i=0;i<n;i++) { if (val==array[i]) { return i; } } return -1; }
2、二分查找
int find2(int *array,int n,int val) { if (n<=0) { return -1; } int begin=0,end=n-1,mid; while(begin<=end) { mid=(begin+end)/2; if (array[mid]==val) return mid; else if(array[mid]>val) end=mid-1; else begin=mid+1; } return -1; }
3、二叉查找树
//二叉查找树数据结构 typedef struct Btree { int data; Btree *left; Btree *right; }*PBTree; //创建二叉查找树,返回树的根节点 PBTree CreateBTree(int *array,int n) { PBTree root=new Btree; root->data=array[0]; root->left=NULL; root->right=NULL; PBTree current,back,pNew; for (int i=1;i<n;i++) { pNew=new Btree; pNew->data=array[i]; pNew->left=pNew->right=NULL; current=root; while(current!=NULL) //找到合适的插入位置 { back=current; if(current->data>array[i]) current=current->left; else current=current->right; } if(back->data>array[i]) back->left=pNew; else back->right=pNew; } return root; } //利用二叉查找树进行递归查找 bool find3(PBTree root,int val) { if (root==NULL) return false; if (root->data==val) return true; else if(root->data>val) return find3(root->left,val); else return find3(root->right,val); }
4、哈希查找(除留取余法+链式法)
#define MAX 10 //链表数据结构 typedef struct list { int data; list *next; }*pList; list hashtable[MAX]; ///链式法解决地址冲突,MAX个带头节点的hash链表 //除留取余法 int hashFunc(int n) { return n%MAX; } //创建hash链表 void createhash(int *array,int n) { pList p,pNew; for (int i=0;i<n;i++) { pNew=new list; pNew->data=array[i]; pNew->next=NULL; int pos=hashFunc(array[i]); p=hashtable[pos].next; if (p!=NULL) //将新的节点插入到头结点的后面 { pNew->next=p; hashtable[pos].next=pNew; } else { hashtable[pos].next=pNew; } } } //hash查找 bool SearchHash(int val) { int pos=hashFunc(val); //找出在哪个hash链表 pList p=hashtable[pos].next; //遍历对应的链表 while(p!=NULL) { if(p->data==val) return true; p=p->next; } return false; } //遍历hashtable void TraverseHashtable() { for (int m=0;m<MAX;m++) //一次遍历每个链表里面的内容 { pList p1=hashtable[m].next; while(p1!=NULL) { cout<<p1->data<<" "; p1=p1->next; } } cout<<endl; }