查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
(一)顺序表查找:从表的第一个记录开始依次往后,直到最后一个记录,查找到的话返回,否则返回-1。
// 线性查找,找到返回下标的索引值,否则返回-1
public static int arrSearch(int[] arr, int target) {
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
index = i;
break;
}
}
return index;
}
//测试代码
public static void main(String[] args) {
int[] arr = new int[] { 5, 6, 7, 34, 5, 1, 0, 4, 3, 2, 9, 8 };
int res = arrSearch(arr, 1);
//返回5
System.out.println(res);
}
(二)有序表查找:
折半查找(二分查找):线性表中的记录有序,且采用顺序存储。基本思想是取中间值为比较对象,如果中间值等于被查找值,则返回;如果中间值大于被查找值,则在前半序列继续二分查找;如果中间值小于被查找值,则在后半序列继续二分查找。
public static int biSearch(int[]arr,int target) {
int begin=0;
int end=arr.length-1;
int mid=(begin+end)/2;
int index=-1;
while(true) {
//如果没找到返回-1
if(begin>=end)return -1;
//中间值等于被查找值
if(arr[mid]==target) {
index=mid;
break;
}
else {
//中间值大于被查找值
if(arr[mid]>target)end=mid-1;
//中间值小于被查找值
else begin=mid+1;
}
mid=(begin+end)/2;
}
return index;
}
//测试代码
public static void main(String[] args) {
int[]arr=new int[] {1,2,3,4,5,6,7,8,9};
int res=biSearch(arr, 4);
//返回3
System.out.println(res);
}