顺序查找
基本思想
从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。
说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。
适用于线性表的顺序存储结构和链式存储结构。
计算平均查找长度
例如上表,查找1需要1次,查找2需要2次,依次往下推,可知查找16需要16次,
可以看出,我们只要将这些查找次数求和(我们初中学的,上底加下底乘以高除以2),然后除以结点数,即为平均查找长度。
设n=节点数
平均查找长度=(n+1)/2
用Java实现
import java.util.Scanner;
public class SequentialSearch {
int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
public SequentialSearch(){
System.out.println("请输入要查询的数字:");
Scanner input=new Scanner(System.in);
int input1=input.nextInt();
for(int i=0;i<a.length;i++){
if(a[i]==input1){
System.out.println(input1+"的位置为:"+i);
break;
}
if(i==a.length-1)
System.out.println("No Result!");
}
}
}
二分查找
基本思想
平均查找长度=Log2(n+1)-1
注:虽然二分法查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算,所以二分法比较适用于顺序存储结构。为保持表的有序性,在顺序结构中插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动而又经常需要查找的线性表。
用折半查找时序列必须是有序的!
用Java实现
import java.util.List;
public class binarySearch {
public binarySearch(){
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<10000;i+=2){ //往list加入逐渐增大1-10000的所有偶数,作为实验数组,很明显,他是有序的!
list.add(i); //这里当然也可用数组
}
int low=0;
int high=list.size();
int key=3334;
while(low<=high){
int mid=(low+high)/2;
if(key==list.get(mid)){
System.out.println("此数值在list中的位置为:"+mid);
break;
}
if(key>list.get(mid)){
low=mid+1; //当小于时,是low指针向后移动,high指针不变
}
if(key<list.get(mid)){
high=mid-1; //当大于时,是high指针向前移动,low指针不变
}
}
if(low>high){
System.out.println("没有查到结果!");
}
}
}