分块查找
分块查找(索引顺序查找):分块查找又称索引顺序查找,是顺序查找的一种改进方法,除本身外,还需要建立一个索引表,由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。它吸取了顺序查找和折半查找各自的优点,既有动态结构,又适于快速查找。折半查找其实也算是分块查找的特殊用法,分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。
分块查找的基本思想:
①把线性表分成若干块,每块包含若干个元素
②块内无序,块间有序。
③建立一个索引表,把每块中的最大关键字值和每块的第一个元素在表中的位置和最后一个元素在表中的位置存放在索引项中。
④先确定待查数据元素所在的块,然后再块内顺序查找
import java.util.Scanner;
public class 分块查找3 {
/*
* 分块查找
*/
/**
* @param index 每个元素代表的是每块的最大值
* @param array 代表的是要查找的数组
* @param key 代表要查找的元素
* @param m 代表每个块的大小
* @return
*/
public static int blockSearch(int[] index,int[] array,int key,int m) {
int i=search(index,key);
if(i<0)
return -1;
for(int j=m*i,length=j+m;j<length;j++) {
if(array[j]==key)
return j;
}
return -1;
}
public static int search(int[] index,int key) {
int start=0;
int end=index.length-1;
if(key>index[end])
return -1;
while(start<=end) {
int mid=start+((end-start)>>1);
if(index[mid]>=key) {
end=mid-1;
}else {
start=mid+1;
}
}
return start;
}
public static void main(String[] args) {
int[] index= {31,62,88};
int[] array= {14,31,8,22,18,43,62,49,35,52,88,78,71,83,100};
Scanner scan=new Scanner(System.in);
System.out.println("请输入要查找的数:");
int a=scan.nextInt();
System.out.println(blockSearch(index,array,a,6));
}
}