1.顺序查找
依次比较结构中的每个元素,这种查找方式最直接,也是最简单的了。
2.二分查找(折半查找)
简单的说就是每次比较的时候都和中间的元素进行比较!如下图:
代码:
int BinarySearch(int a[],int dat,int len)
{
int start=0,end=len-1,mid;
while(start<=end)
{
mid=(start+end)/2;
if(a[mid]==dat)
return start;
else if(dat < a[mid])
end=mid-1;
else
start=mid+1;
}
return -1;
}
3.二叉排序树查找
这种方式的查找首先需要创建二叉排序树,然后与元素进行比较
特点是: 对于根节点,左边的数据总是比右边的数据要小,根节点排在中间即: 右>中>左,对于每一颗树 都是遵循相同的这种规则;创建代码如下:
void InsertBSTree(pBSTree t,int key)
{
pBSTree pT,parent,head;
if(!(pT=(pBSTree)malloc(sizeof(BSTree))))
{
printf("内存分配失败!\n");
exit(-1);
}
pT->dat=key;
pT->left=pT->right=NULL;
head=t;
while(head)
{
parent=head;
if(key < head->dat)
head=head->left;
else
head=head->right;
}
if(key < parent->dat)
parent->left=pT;
else
parent->right=pT;
}
void CreateBSTree(pBSTree p,int a[],int n)
{
int i;
p->dat=a[0];
p->left=p->right=NULL;
for(i=1; i<n; i++)
InsertBSTree(p,a[i]);
}
其查找代码更简单了,递归就可以了:
如下:
pBSTree SearchData(pBSTree p,int dat)
{
if(!p || dat == p->dat)
return p;
else if(dat < p->dat)
return SearchData(p->left,dat);
else
return SearchData(p->right,dat);
}
4.索引查找和散列表(应该也叫Hash哈希查找)
这两种方式的查找都一个共同的特点就是,找到数据中关键字key之间的关系,然后以某一函数的方式,对关键字key进行处理,当查找的时候也按照关键字的函数关系查找。当然,哈希查找还有数据存储冲突的问题,需要采用一定的方法去避免这种冲突。这两种方式都绕了点弯,不过整体上还是比较好啊理解的!
索引查找:这里函数的关系是除以100的方式先得到索引表中的相关项,再在主表中根据索引表查找...
int IndexSearch(int key)
{
int i,index,start,length;
index=key/100;
for(i=0;i<INDEXTABLE_LEN;i++)
{
if(indextable[i].index==index)
{
start=indextable[i].start;
length=indextable[i].length;
break;
}
}
if(i>=INDEXTABLE_LEN)
return -1;
for(i=start; i<start+length; i++)
if(stu[i]==key)
return i;
return -1;
}
//hash search 散列表查找
void InsertHash(int hash[],int m,int data)
{
int i;
i=data%13;
while(hash[i])
i=(++i)%13;
hash[i]=data;
}
void CreateHash(int hash[],int m,int data[],int n)
{
int i;
for(i=0; i<n; i++)
InsertHash(hash,m,data[i]);
}
int HashSearch(int hash[],int m,int key)
{
int i;
i=key%13;
while(hash[i] && hash[i]!=key)
i=(++i)%m;
if(hash[i]==0)
return -1;
else
return i;
}
hash的意思就是无序的,混乱的,所以散列表的查找没有一定的规律,但是查找的时候还是从当前查找元素应该在的结构中的数据依次查找!
数据结构与算法的基本部分大概就这些了,有时候感觉很多东西,你看起来,理解起来,so easy!但是用起来可能就会有问题,而且又很容易忘记,所以我觉得重要的还是后期的具体运用,在实践中熟悉,熟练运用才是硬道理!