一、顺序查找法
顺序查找,顾名思义,就是从头到尾遍历的查找,直到找到要找的元素x为止,所以这种方法对于有n个元素的线性表而言,在最坏情况下需要n次比较。
程序:
在个数为n的数组中查找x,输出查找信息。有则返回x的位置。
int search(type arr[],type x,int n){
int i;
for(i=0;i<n;i++)
if(arr[i]==x){
retuern i;
break;
}
return 0;
}
函数调用结果:若找到,返回位置,若没找到,返回0。
二、二分查找法(折半查找法)
使用二分查找法的前提是要查找的序列是已经排序好的,所以若序列不是顺序的,应先对其进行排序,或者从小到大,或者从大到小。这种方法的特点是无论怎样查找,每次都只是在一半的数据中查找。
程序(递归):
int search(type arr[],type x,int left, int right){
int middle;
while(left<=right){
middle=(left+right)/2;
if (x==a[middle])
return middle;
else {
if (x>a[middle]) left=middle+1;
else right=middle-1;
return search(type arr[],type x,int left, int right);
}
}
return 0;
}
函数调用结果:若找到,返回位置,若没找到,返回0。
三、二叉排序树查找
二叉树是一种很有用的非线性结构。在二叉树中,每一个结点的度最大为2,二叉树中的每个结点的子树被分为左子树和右子树。在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。当一个结点既没有左子树也没有右子树时,该结点即为叶子结点。
1、特点:
1)非空二叉树只有一个根结点;
2)每一个结点最多有两棵子树,且分别称为该结点的左子树和右子树。
2、性质:
1)在二叉树的第k层上,最多有2k-1(k≥1)个结点;
2)深度为m的二叉树最多有2m-1个结点;
3)在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
4)具有n个结点的二叉树,其深度至少为〔log2n〕+1,其中〔log2n〕表示取log2n的整数部分。
3、程序:
typedef struct BiTNode//定义二叉树节点结构
{
int data;
struct BiTNode *lchild,*rchild; //左右孩子指针域
}BiTNode,*BiTree;
int search(BiTree T,BiTree &p ,int key, BiTree f)
//T是二叉树,p是作为返回被查找元素在二叉树中的位置,key是待查找元素,f是T的双亲,初始值为NULL
{
BOOL tmp1,tmp2;
tmp1=tmp2=False;
if(!T) //查找不成功
{p=f; return False;}
else if(key==T->data) //查找成功
{p=T; return True;}
else if(key < T->data) //在左子树
tmp1=search(T->lchild,key,T,p);//在左子树中继续查找
else //在右子树
tmp2=search(T->rchild,key,T,p);//在右子树中继续查找
if(tmp1||tmp2)
return True; //若在子树中查找成功,向上级返回True
else
return False; //否则返回False
}