我们如果想在数组中找到某个我们想要的值,很好想到 我们遍历整个数组 如果遍历的数组值与我们想要的值相等就返回此数组元素的下标。
public static int search(int[] arr,int key) //普通查找 数组有序无序均可
{
for(int x = 0;x<arr.length;x++) //遍历整个数组
{
if(arr[x] == key) //如果相等就返回下标
{
return x;
}
}
return -1; //如果数组中不存在此元素则返回-1
}
但是这种方法效率低下 需要遍历所有元素,即使数组元素是有序的也会遍历整个数组。
因此我们需要寻求一种简单便捷的方法(对于有序数组) 我们在此使用折半查找(二分法)来查找有序数组中的元素。
public static int halfSearch(int[] arr,int key) //不与系统的折半查找重名 随便起的
{
int min = 0; //最小值下标 初值为0
int max = arr.length-1; //最大值下标 初值为长度减一
int mid = (min+max)/2; //中间值下标 初值为 (min + max) / 2
while(min<=max) //最小值下标肯定小于最大值下标 如果不满足说明没有找到此元素 所以return -1;
{
if(key>arr[mid]) //如果查找的值大于中间值 我们将最小值移到中间值右侧
{
min = mid+1;
mid = (min+max)/2;
}
if(key<arr[mid]) //如果查找的值小于中间值,我们将最大值移到中间值左侧
{
max = mid -1;
mid = (min+max)/2;
}
if(key == arr[mid]) //如果相等则返回其下标
return mid;
}
return -1;
}
为便于理解,以上为查找369的画图步骤。^<>^
当然请注意 折半查找只能对有序数组操作。