java查找算法之二分查找

查找算法之二分查找

二分查找,一个既简单,又实用,又容易被所有面试官问到的问题,可以可以

以下分为查找一个值和查找多个相同 的值

package cn.ycl.dataStructures.Search;
public class BinarySearch {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arr[] = { 1, 4, 7, 9, 12, 90, 98 };
		int binarySearch = binarySearch(arr, 0, arr.length-1, 12);
		System.out.println(binarySearch);
	}
	public static int binarySearch(int arr[], int left, int right, int findVal) {
		if (left>right) {
			return -1;
		}
		int mid = (left + right) / 2;
		
		
		if (arr[mid] < findVal) {
			left = mid + 1;
			return binarySearch(arr, left, right, findVal);
		} else if (arr[mid]> findVal) {
			right = mid - 1;
			return binarySearch(arr, left, right, findVal);
		} else {
			return mid;
		}
	}
}


//以下为同时查找所有等于要查找的值,
package cn.ycl.dataStructures.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, 4, 7, 9, 12, 12, 90, 98 };
		List<Integer> binarySearch = binarySearch(arr, 0, arr.length - 1, 12);
		System.out.println(binarySearch.size());
		for (Integer integer : binarySearch) {
			System.out.println(integer);
		}
	}
	public static List<Integer> binarySearch(int arr[], int left, int right, int findVal) {
		if (left > right) {
			return null;
		}
		int mid = (left + right) / 2;
		if (arr[mid] < findVal) {
			left = mid + 1;
			return binarySearch(arr, left, right, findVal);
		} else if (arr[mid] > findVal) {
			right = mid - 1;
			return binarySearch(arr, left, right, findVal);
		} else {
			
			ArrayList<Integer> list = new ArrayList<Integer>();
			//相mid的左边扫描
			int temp=mid-1;
			while (true) {
				if (temp<0|| arr[temp] !=findVal) {
					break;
				}
				list.add(temp);
				temp -=1;
			}
			list.add(mid);
			//向mid的右边扫描
			temp=mid+1;
		
			while (true) {
				if (temp>arr.length-1 || arr[temp] !=findVal) {
					break;
				}
				list.add(temp);
				temp +=1;
			}
		
			return list;
		}
	}
}
posted @ 2022-06-14 08:50  道祖且长  阅读(78)  评论(0)    收藏  举报