查找的基本概念:广义地讲:查找是在具有相同类型的记录构成的集合中找出满足给定条件的记录。给定的查找条件可能是多种多样的,为了便于讨论,我们把查找条件限制为"匹配",即在查找关键码等于给定值的记录。
线性表的查找技术:在线性表中进行的查找属于静态查找。线性一般有两种存储结构:顺序存储和链式存储结构,此时可以采用顺序查找技术;对顺序存储结构,若记录已按照关键码有序,可采用更高效的查找技术-----折半查找技术!
顺序查找:顺序查找又称线性查找,是最基本的查找技术之一,其基本思想为:从线性表的一端向另外一端逐个将关键码与给定的值比较。肉相等,则查找成功,给出该记录在表中的位置;若整个表检测完任未检测到与给定值相等的关键码,则查找失败,给出失败信息。
线性表的顺序查找:介绍一种改进的算法:设置“哨兵”。哨兵就是待查找的值,将它放在查找方向的“尽头处”,免去了在查找过程中每一次比较后都要判断查找位置是否越界,从而提高查找速度。
查找代码如下:
/**
* 从数组下标1开始存放待查集合
* 若返回0,则查找不成功,不是0则是待查记录在数组中的下标
*/
public int search(int r[],int n,int k){
r[0]=k;
while(r[n]!=k)n--;
return n;
}
单链表的顺序查找技术:假设带头结点的单链表的头指针为first,z在单链表中的顺序查找算法如下
public int LinkSearch(int k){
Node p=first.next();//p初始化为第一个元素的结点
while(p!=null&&p.data!=k){
p=p.next();
j++;
}
if(p.data==k) return j;
else return 0;
}
折半查找:相对于顺序查找来说,折半查找技术的要求比较高,它要求线性表中的记录必须按照关键码有序,并且必须采用顺序存储。折半查找技术一般只能应用于静态查找。
基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录关键码相等,则查找成功。若给定值小于中间记录的关键码,则在中间记录的左半区继续查找;若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录。
/**
* 折半查找的非递归
* 从数组下标1开始存放待查集合
*/
public int BigSearch(int r[],int n,int k){
int low=1;
int high=n;
while(low<=high){
int mid=(low+high)/2;
if(k>r[mid]) low=mid+1;
else if(k<r[mid]) high=mid-1;
else return mid;
}
return 0;
}
/**
* 折半查找的递归算法
*/
public int BigSearch2(int r[],int low,int high,int k){
if(low>high) return 0;
else{
int mid=(low+high)/2;
if(k<r[mid]) return BigSearch2(r,low, mid-1, k);
else if(k>r[mid]) return BigSearch2(r,mid+1, high, k);
else return mid;
}
}