优点:最简单,对元素排列次序无要求,插入新元素方便。
缺点:速度慢,平均查找长度为(n+1)/2,约为表长度一半。
提高效率的方法:按查找概率从大到小排列。事先未知概率的情况下,每次查找到一个元素时,将它与前驱元素对调位置,这样,查找频度高的元素就会逐渐前移。
代码::
int search (int a[],int v,int begin,int end)
{
int i;
for(i = 1;i<=end;i++)
if(v==a[i]) return i; //如果相等,返回下标。
return -1; //否则返回-1.
}
二分查找(binary search)又称折半查找,对分查找。作为二分查找对象的数据表必须是顺序存储的有序表。
二分查找的过程:有序表A[0]~A[n-1],首先取中点元素A[mid]的关键字同给定值K进行比较,若相等则查找成功;否则,若K< A[mid].key,则在左子表中继续进行二分查找;若K> A[mid].key,则在右子表中继续进行二分查找;这样,经过一次比较,就缩小一半查找空间,如此进行下去,直到查找成功,或者当前查找区间为空时为止(或区间的下界大于等于上界时为止)。
二分查找的过程是递归的,也很容易写成非递归算法,只需要根据情况修改待查找区域的上下界即可。
二分查找过程可用一棵二叉树来描述,树中的每个根结点对应当前查找区间的中点元素,它的左子树和右子树分别对应该区间的左子表和右子表,通常把此树称为二分查找的判定树。由于二分查找在有序表上进行,所以其对应的判定树是一棵二叉搜索树(排序树)。
在有序表上二分查找一个关键字等于K的元素时,对应着判定树中从根结点到待查结点的一条路径,同关键字进行比较的次数就等于该路径上的结点数,或者说等于待查结点的层数。
优点:时间复杂度为O(logn),查找速度快。
缺点:需要建立有序表,并且插入和删除会比较麻烦。另外,只适用于顺序存储的有序表,不适用于链接存储的有序表。
代码::
int search (int a[],int v,int begin,int end)
{
while(end>=begin)
{
int m = (begin+end)/2;//中间值
if(v== a[m]) return m;
if(v<a[m]) end=m-1; //小于中间值,向左区间查找。
else begin=m+1;//否则右区间查找。
}
return -1;
}