线性查找算法
public class SeqSearch{
public static void main(String[] args){
int[] arr = {1, 9, 11, -1, 34, 89};
int index = seqSearch(arr, 11);
if(index == -1){
System.out.println("没有找到");
}else{
System.out.println("找到了,下标 = " + index);
}
}
public static int SeqSearch(int[] arr, int findVal){
for(int i = 0; i < arr.length; i++){
if(arr[i] == findVal){
return i;
}
}
return -1;
}
}
二分查找
注意使用二分查找的前提是该数组是有序的!
这里的二分查找,主要是利用了递归法
下面我们先提出一种写法,这种写法的缺点再于只能返回第一个找到的目标值的下标
public class BinarySearch{
public static void main(String[] args){
int[] arr = {1, 2, 4, 6, 12, 45, 56};
int resIndex = binarySearch(arr, 0, arr.length - 1, 4);
System.out.println("resIndex = " + resIndex);
}
public static int binarySearch(int[] arr, int left, int right, int findVal){
if(left > right){
return -1;
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if(findVal < mid){
binarySearch(arr, left, mid - 1, findVal);
}else if(findVal > mid){
binarySearch(arr, mid + 1, right, findVal);
}else{
return mid;
}
}
}
下面我们优化一下用数组返回所有找到的结果
public class BinarySearch{
public static void main(String[] args){
int[] arr = {1, 2, 4, 6, 12, 45, 56};
List<Integer>resIndexList = binarySearch(arr, 0, arr.length - 1, 4);
System.out.println("resIndexList = " + resIndexList);
}
public static int binarySearch(int[] arr, int left, int right, int findVal){
if(left > right){
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if(findVal < mid){
binarySearch(arr, left, mid - 1, findVal);
}else if(findVal > mid){
binarySearch(arr, mid + 1, right, findVal);
}else{
//思路分析:
//1.在找到mid值的时候,不要马上返回
//2.向mid索引值左边扫描,将所有满足findVal的元素的下标,加入到集合ArrayList
//3.向mid索引值右边扫描,将所有满足findVal的元素的下标,也加入ArrayList
//4.将ArrayList返回
ArrayList<Integer>resIndexList = new ArrayList<Integer>();
int temp = mid - 1;
while(true){
if(temp < 0 || arr[temp] != findVal){
break;
}else{
resIndexList.add(temp);
temp -= 1;//temp左移
}
}
//把第一次时找到的那个值放进去
//注意这个要放在左查找后面再放进去,保证顺序
resIndexlist.add(mid);
temp = mid + 1;
while(true){
if(temp > arr.length - 1 || arr[temp] != findVal){
break;
}
else{
resIndexlist.add(temp);
temp += 1;//temp左移
}
}
}
}
}