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] == mid) {
aList.add(temp);
temp--;
}
aList.add(mid);
temp = mid + 1;
while(temp < arr.length && arr[temp] == mid) {
aList.add(temp);
temp++;
}
return aList;
}
}