三大查找算法中,线性查找对数组没有要求,但是二分查找和插值查找。都要求数组是有序的
class Select {
/*
* 线性查找:遍历整个数组进行查找
*/
public static int linear(int array[], int value) {
for (int i = 0; i < array.length; i++) {
if (array[i] == value) {
return i;
}
}
return -1;
}
/*
* 二分查找: 注意:使用的数组必须为有序的(由小到大)
*/
public static int binarSearch(int array[], int left, int right, int value) {
// 当left>right时,就表示没有找到
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
if (array[mid] > value) {
return binarSearch(array, left, mid - 1, value);
} else if (array[mid] < value) {
return binarSearch(array, mid + 1, right, value);
} else {
return mid;
}
}
/*
* 插值查找,通过比较插入的值在数组中的大致分布求出
*/
public static int insertSearch(int array[], int low, int high, int value) {
if (low > high || value < array[0] || value > array[array.length - 1]) {// 防止mid出现过大或者过小的值
return -1;
}
if (array[high] - array[low] == 0 && array[low] != value) {
return -1;
} else if (array[high] - array[low] == 0 && array[low] == value) {
return low;
} else {
int mid = low + (high - low) * (value - array[low]) / (array[high] - array[low]);// 为了防止这里出现0,先进行if判断
if (array[mid] > value) {
return insertSearch(array, low, mid - 1, value);
} else if (array[mid] < value) {
return insertSearch(array, mid + 1, high, value);
} else {
return mid;
}
}
}
}