一、查找算法概述
1、查找是指从一批记录中找出满足指定条件的某一记录的过程,查找又称为检索。
2、在执行查找操作的时候,往往只是指定一个或几个域的值。这些作为查找条件的域称为关键字,关键字分为两类:
(1)主关键字:如果关键字可以唯一标识数据结构中的一个记录,则称次关键字为主关键字。
(2)次关键字:如果关键字不能唯一区分各不同记录,则称此关键字为次关键字。
3、对于无顺序的数据,只有逐个比较数据,才能找到需要的内容,这称为顺序查找。
4、对于有顺序的数据,可以选择顺序查找法逐个比较,也可以采取更快速的方式找到需要的数据。
二、顺序查找
1、顺序查找执行的操作是从数据序列中的第一个元素开始,从头到尾依次逐个查找,直到找到所需要的数据或搜索完整个数据序列。
2、顺序查找主要针对少量的、无规则的数据。
3、对于包含n个数据的数据序列,使用顺序查找法查找数据,最理想的情况是目标数据位于数组的第一个位置,这样比较一次就能找到目标数据,最差的情况是需要比较完所有的数据才找到目标数据或确认没有该数据。平均比较次数为n/2次,效率较差。
4、通过一个循环,将数组中的各元素依次与查找目标数据进行比较。核心代码:
int search(int[] a,int x){ //a为数据序列,x为待查找数据
int f=-1;
for(int i;i<a.length;i++){
if(x==a[i]){ //查找数据
f=i;
break;
}
}
return f
}
三、折半查找
1、折半查找又称为二分查找,要求数据序列呈线性结构,也就是经过排序的。
2、步骤
(1)定义3个变量lownum(数组元素的开始)、midnum(数组元素的中间)、highnum(数组元素的末尾)。
(2)如果序号为midnum的数组元素的值与x相等,表示查找到了数据,返回该序号midnum。
(3)如果x<a[midnum],表示要查找的数据x位于lownum与midnum-1之间,就不需要再去查找midnum与highnum之间的元素。因此,将highnum的值改为midnum-1,重新查找lownum与highnum之间的数据。
(4)如果x>a[midnum],表示要查找的数据x位于midnum+1与highnum之间,就不需要再去查找lownum与midnum之间的元素。因此,将lownum的值改为midnum+1,重新查找lownum与highnum之间的数据。
(5)逐步循环,如果到lownum>highnum时还未找到目标数据x,则表示数组中无此数据。
3、核心代码:
int search(int[] a,int n,int x){ //n为数组a长度,x为目标数据
int mid,low=0,high=n-1;
while(low<=high){
mid=(low+high)/2;
if(a[mid]==x)
return mid;
else if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return -1; //未查找到
}
四、数据结构中的查找算法
1、顺序表结构中的查找算法
(1)顺序表结构是典型的线性表结构,顺序表在存储时才有结构数组的形式。顺序表结构中的查找算法就是查找数据的结点,并返回该结点在线性表中的位置。如果在线性表中没有找到值为x的结点,则返回一个错误标志。根据值x类型的不同,查找结点可以分为按照序号查找结点和按照关键字查找结点2中方式。
(2)按序号查找结点
对于一个顺序表,序号就是数据元素在数组中的位置,也就是数组的下标。
(3)按关键字查找结点
关键字可以是数组元素结构中的任意一项。
2、链表结构中的查找算法
(1)链表结构是一种顺序结构,采用链式存储的方式。
(2)对于链表结构,一般通过关键字进行查询。
3、树结构中的查找算法
树结构是一种描述非线性层次关系的数据结构。查找结点就是遍历二叉树中的每一个结点,逐个比较数据,当找到目标数据时将返回该数据所在结点的指针。
4、图结构中的查找算法
图结构是一种非线性数据结构,每个数据元素之间可以任意关联。图结构的查找算法,就是查找图中是否包含某个顶点。可以通过图结构的遍历算法进行查找。