编程珠玑第十三章----查找

来源:互联网 发布:文件管理器软件 编辑:程序博客网 时间:2024/05/17 08:44

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;elsebegin=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;elsecurrent=current->right;}if(back->data>array[i])back->left=pNew;elseback->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);elsereturn 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;}//遍历hashtablevoid TraverseHashtable(){for (int m=0;m<MAX;m++) //一次遍历每个链表里面的内容{pList p1=hashtable[m].next;while(p1!=NULL){cout<<p1->data<<" ";p1=p1->next;}}cout<<endl;}

 

原创粉丝点击