1、顺序查找过于简单,此处就不再赘述。
2、二分查找(适用于有序数组)
- 思路: 要找的元素为targe,数组为arr:
1、首先定义left和right(left:数组最左边的index,right:数组左右最右边的index)
2、定义mid = (left+right)/2,比较mid处的元素和targe的大小
2.1、如果arr[mid]>targe,那么要找的元素在left--mid之间,递归的进行左遍历;
2.2、如果arr[mid]<targe,那么要找的元素在mid--right之间,递归的进行右遍历;
2.3、如果arr[mid]=targe,则此时找到了一个和targe值相同的元素了。可以返回;
- 代码:
package Search;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,2,3,4,4,4,5,6,7,8};
BinarySearch binarySearch = new BinarySearch();
int a = binarySearch.binarySearch(40, arr, 0, arr.length-1);
}
public int binarySearch(int targe, int[] arr, int left, int right) {
if(left > right) {
return -1;
}
int mid = (left + right)/2;
if(targe > arr[mid]) {//mid--right
return binarySearch(targe, arr, mid+1, right);
}else if(targe < arr[mid]) {//left --- mid
return binarySearch(targe, arr, left, mid - 1);
}else {
return mid;
}
}
}
思考:当数组中有相同的元素时,怎么用二分查找法将和目标元素相同的所有元素查找到
(只需要在targe == arr[mid]处,左右遍历数组即可)
代码:
public ArrayList<Integer> binarySearch2(int targe, int[] arr, int left, int right) {
if(left > right) {
return new ArrayList<Integer>();
}
int mid = (left + right)/2;
if(targe > arr[mid]) {//mid--right
return binarySearch2(targe, arr, mid+1, right);
}else if(targe < arr[mid]) {//left --- mid
return binarySearch2(targe, arr, left, mid - 1);
}else {
ArrayList<Integer> aList = new ArrayList<Integer>();
//改此处(左右遍历两边,将相同的元素放入list中)
//先往左查找
int temp = mid - 1;
while(temp > 0 && arr[temp] == arr[mid]) {
aList.add(temp);
temp--;
}
aList.add(mid);
temp = mid + 1;
while(temp < arr.length && arr[temp] == arr[mid]) {
aList.add(temp);
temp++;
}
return aList;
}
}