第一类——比较式查找算法
(1)基于线性表的查找:顺序查找、折半查找即二分查找、索引查找即分块查找
(2)基于树的查找:二叉排序树、B树、AVL树等
第二类——散列法(不需要比较)
一、顺序查找
1.算法原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位。
2.核心代码
public static int search(int[] a, int num) {
for(int i = 0; i < a.length; i++) {
if(a[i] == num){//如果数据存在
return i;//返回数据所在的下标,也就是位置
}
}
return -1;//不存在的话返回-1
}
3.平均查找长度:ASL = (n+....+2+1)/n= (n+1)/2。
二、二分查找
1.算法原理:
a) 前提条件:已排序的数组中查找
b) 二分查找的基本思想是:首先确定该查找区间的中间点位置: int mid = (low+upper) / 2;然后将待查找的值与中间点位置的值比较:若相等,则查找成功并返回此位置。若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域。若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域。下一次查找是针对新的查找区间进行的。
c) 图例说明:
原始数据: int[] a={5,3,6,1,9,8,2,4,7}; 查找是否存在数字8;
第一步,先用之前学过的排序方法将数组按升序排序:int[] a={1,2,3,4,5,6,7,8,9};
第二步,取中间数:5跟8比较,8大于5 ,取中间数右侧的数组进行比较,即{6,7,8,9}
第三步:重复第一步和第二步,直到找到数据或者比较完所有数据。
2.核心代码
//首先对数组进行排序,这里用冒泡排序
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//二分查找算法
public static int binarySearch(int[] arr,int num){
int low=0;
int upper=arr.length-1;
while(low<=upper){
int mid=(upper+low)/2;
if(arr[mid]<num){
low=mid+1;
}
else if(arr[mid]>num){
upper=mid-1;
}
else
return mid;
}
return -1;
}
3.平均查找长度:ASL =(1/n)* ( j * 2^(j-1) )(j是从1到h),ASL = log2(n+1)-1。
三.索引查找
1.算法原理
(1).先取各块中的最大关键字构成一个索引表。
(2).查找分为两部分,先对索引表进行二分查找或是顺序查找,以确定待查记录在哪一块中。
(3).然后,在已经确定的块中用顺序法进行查找。
2.平均查找长度:把r【1....n】分为 b 块
如果以二分查找来确定块,则 ASL = log2(b+1)-1 + (s+1)/2。
如果以顺序查找来确定块,则 ASL = (b+1)/2 + (s+1)/2。
如果以哈希查找来确定块,则ASL=1 + (s+1)/2。
3分块查找的优点:
(1).在表中插入或删除一个记录时,只要找到该记录所属的块,就在该块内进行插入和删除运算。
(2).因为块内记录的存放是任意的,所以插入或删除比较容易,无须移动大量记录。
缺点:分块查找算法的主要代价是增加一个辅助数组的存储空间。