编程珠玑第十三章----查找
2012-07-27 13:17
225 查看
1、顺序查找
2、二分查找
3、二叉查找树
4、哈希查找(除留取余法+链式法)
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; }
相关文章推荐
- 编程珠玑 第十三章 习题4 思考
- 模式识别-查找向量中元素之和最大的连续子向量---编程珠玑
- 【编程珠玑】第二章 二分查找的巧妙应用
- 由July师兄二分查找代码及编程珠玑有感:循环不变性(断言)证明程序的正确性及发现bug
- 二分查找递归实现--【编程珠玑】
- 二分查找非递归实现--【编程珠玑】
- 【编程珠玑】第二章 二分查找的巧妙应用
- 编程珠玑_第十三章_生成一个随机整数的有序集合
- 二分查找另类--【编程珠玑第四章】
- 【编程珠玑】第十三章 搜索
- 【编程珠玑】第十五章--字符串:用后缀数组查找最长不重叠的重复子串
- 编程珠玑中关于二分查找的使用
- JavaScript 编程珠玑 - 《JavaScript: The good parts》总结(1)
- 编程珠玑之第一章习题4: 生成不同的随机顺序的随机整数及存储与读取
- 编程珠玑之第一章习题7:处理程序存在的缺陷的问答与测试
- 第十三章编程练习(4)
- 实例分析之用ASP编程实现网络内容快速查找的代码
- 编程珠玑 ~~ 排序与随机整数序列
- NOI题库1.11编程基础之二分查找 矩形分割