线性查找:
线性查找是最简单的对数组进行遍历的查找方法。
查找一个符合条件的数,代码如下:
public static int linear2(int[] arr,int findVal){
for (int i = 0; i <arr.length ; i++) {
if (arr[i]==findVal){
return i;
}
}
return -1;
}
查找全部符合条件的数,代码如下:
public static List<Integer> linear1(int[] arr, int findVal){
List<Integer> List=new ArrayList();
for (int i = 0; i <arr.length ; i++) {
if (arr[i]==findVal){
List.add(i);
}
}
return List;
}
二分查找:
注意:二分查找的前提必须是有序数组
二分查找代码思路如下:
1,定义两个辅助指针left和right,待查找的元素在arr[left]~arr[right]之间
left的初始值为0,right的初始值为arr.length-1;
2,将数组分成凉拌:int mid=(left+right)/2,然后让midVal=arr[mid]与findVal进行比较大小
如果midVal>findVal,说明待查找的值在数组的左边
如果midVal<findVal,说明待查找的值在数组的右边
如果midVal==findVal,说明查到该值,返回
3,说明时候结束递归?
(1)找到目标值
(2)直到left>right还没有找到该值
二分查找代码如下:
public static List binarySearch(int[] arr,int left ,int right,int findVal){
//当left>right时,说明已经扫描了整个数组,但没有找到
if (left>right){
return new ArrayList();
}
int mid=(left+right)/2;
int midVal=arr[mid];
if (findVal>midVal){//向右递归
return binarySearch(arr,mid+1,right,findVal);
}else if (findVal<midVal){
return binarySearch(arr,left,mid-1,findVal);
}else {
//1,在找到mid索引值,不要马上返回
//2,向mid索引值的左边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
//3,向mid索引值的右边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
//4,将ArrayList返回
List<Integer> resIndexlist=new ArrayList<Integer>();
//向mid索引的左边扫描,将所有满足条件的元素的下标,加入到ArrayList集合中
int temp=mid-1;
while (true){
if (temp<0||arr[temp]!=findVal){//说明左边没有找到,退出
break;
}
else {
//否则说明左边找到了,就把temp放入到resIndexlist中
resIndexlist.add(temp);
temp -= 1;
}
}
resIndexlist.add(mid);
//想mid索引值的右边扫描,将所有满足条件的元素的下标,加入到ArrayList
temp=mid+1;
while (true) {
if (temp > arr.length - 1 || arr[temp] != findVal) {//退出
break;
} else {
//否则,就temp放入到resIndexlist
resIndexlist.add(temp);
temp += 1;
}
}
return resIndexlist;
}
}