22、查找算法:順序查找+二分查找

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;
			}
			
			
		}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章