1.顺序查找
/**
* 顺序查找
*/
public static void sequentialSearch() {
int[] array = new int[] {3,0,1,9,5,8,2,7,6,4};
int x = 8;
int i;
for(i=0;i<array.length;i++) {
if(array[i] == x) {
System.out.println("x已经被找到了!!!");
break;
}
}
if(i == array.length) {
System.out.println("找不到x!!!");
}
}
2.二分查找
/**
* 二分查找
*/
public static void binarySearch() {
int[] array = new int[] {0,1,2,3,4,5,6,7,8,9};
int x = 67;
int low = 0;
int high = array.length-1;
int middle = (low + high)/2;
while(high > low) {
if(x == array[middle]) {
System.out.println("找到x了!!!");
break;
}else if(x > array[middle]) {
low = middle + 1;
}else {
high = middle - 1;
}
middle = (low + high)/2;
}
if(high <= low) {
System.out.println("找不到x!!!");
}
System.out.println(high+"--"+low);
}
3.分块查找
首先来讲一下分块查找的实现原理,如下图:
待查找元素一共分为3块,每块6个元素,虽然待查找元素整体是无序的,但是块间元素是有序的,即第2块的所有元素均大于第1块中的所有元素,再根据分块建立索引表,如上图所示。
在查找时首先判断需要查找的元素位于哪一个分块中,然后再在具体分块中进行具体的查找。
在查找分块和查找具体值时可以根据具体情况选用顺序查找或者二分查找。
java实现代码如下:
/**
* 分块查找
*/
public static void blockSearch() {
//查找表
int[] array = new int[] {3,6,1,8,9,23,12,32,18,36,46,43,54,41,51};
/**
* 根据查找表建立索引表
* 将查找表分为3块,每块5个元素
*/
int unit = 5;
int[] indexArr = new int[] {9,36,54};
//假设查找的元素为x
int x = 51;
//在索引表中查找元素x的位置
int index = findIndex(x,unit,indexArr,array);
if(index == -1) {
System.out.println("没有找到!!!");
}else {
System.out.println(x+"位于索引"+index+"处!!!");
}
}
private static int findIndex(int x,int unit,int[] indexArr,int[] array) {
//返回-1表示没有找到
int result = -1;
for(int i=0;i<indexArr.length;i++) {
//若元素x等于索引表中的值,则直接返回x的位置
if(x == indexArr[i]) {
result = (i+1)*unit-1;
break;
}
//若元素x小于索引表中的值,则元素x在第i分块中,继续在分块中查找
else if(x < indexArr[i]) {
int start = i * unit;
int end = (i+1)*unit;
for(int j=start;j<end;j++) {
if(x == array[j]) {
result = j;
break;
}
}
break;
}
}
return result;
}