我们如果想在数组中找到某个我们想要的值,很好想到 我们遍历整个数组 如果遍历的数组值与我们想要的值相等就返回此数组元素的下标。
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的画图步骤。^<>^
当然请注意 折半查找只能对有序数组操作。