在java中常用的查找方法有两种:顺序查找和二分法查找(又叫折半查找)。
一、顺序查找
基本思想:顺序查找算法,从数组中的第0个位置到数组结束逐个的与给定的目标进行匹配,如果匹配到即返回位置,查找数组中所有的值都没有匹配上说明没找到即返回-1。
public static int sequenceSearch(int[] arr, int key) {
for (int i = 0; i < arr.length; i++) {
//从数组的开始到最后,依次的比较要查找的数值,如果相等,则找到
if (arr[i] == key) {
return i;
}
}
//没找到则返回负值 -1
return -1;
}
public static void main(String[] args) {
int arr[] = { 49, 38, 65, 97, 76, 13, 27, 26 };
//要查找的值
int key = 76;
//返回int类型的 数组下标值
int index = sequenceSearch(arr, key);
if (index == -1) {
System.out.println("在该数组中没有找到" + key);
} else {
System.out.println("在该数组中找到了"+ key + ",下标为" + index);
}
}
运行结果:
二、二分法查找
使用二分法查找的前提是数组是有序的,如果是无序的还想用二分法进行查找的话就需要先进行排序再查找。
基本思想:将n个元素分成大致相等的两部分,取a[n/2]与searchVal做比较,如果x=a[n/2],则找到searchVal,算法中止;如果searchVal<a[n/2],则只要在数组a的左半部分继续搜索searchVal,如果searchVal>a[n/2],则只要在数组a的右半部搜索searchVal。
public static int binarySearch(int[] arr, int Searchval) {
//定义一个最低位
int low=0;
//定义一个最高位
int high=arr.length-1;
//如果低位和高位没有重合,说明查找没有结束
while(low<=high) {
//计算中间位置,低位+高位 除于2
int mid=(low+high)/2;
//中间的数字和目标数字进行比较
if(Searchval==arr[mid]) {//如果相等,则找到返回mid
return mid;
}else if(Searchval<arr[mid]) {
//如果value值比中间值小,则说明中间值右侧(比mid大的值)的就不用比较了,
//那么右侧的最高位就是high=mid-1
high=mid-1;
}else if(Searchval>arr[mid]) {
//如果value值比中间值大,则说明中间值的左侧(比mid小的值)的就不用比较了,
//那么左侧的最低位就是low=mid+1
low=mid+1;
}
}
//没有找到就返回负值 -1
return -1;
}
public static void main(String[] args) {
//二分查找条件 必须是排好序的
int arr[] = {13, 26, 27, 38, 49, 65, 76, 97};
int Searchval = 76;
//返回数组的下标
int index=binarySearch(arr,Searchval);
if (index == -1) {
System.out.println("在该数组中没有找到" + Searchval);
} else {
System.out.println("在该数组中找到了"+ Searchval + ",下标为" + index);
}
}
运行结果: