package com.yg.search;/*
@author Mu_Mu
@date 2020/2/28 15:24
*/
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {1, 7, 8, 8,8, 9, 21, 8, 55, 65, 78};
//int resIndex = binarySearch(arr, 0, arr.length - 1, 8);
//System.out.println("resIndex:"+resIndex);
//查找所有值为findVal的序号
List resIndexList = binarySearchIndexList(arr, 0, arr.length - 1, 8);
System.out.println("resIndexList:" + resIndexList);
}
//查找一个序号
//二分查找的数组必须为有序序列
private static int binarySearch(int[] arr, int left, int right, int findVal) {
//如果没有找到返回-1
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
//用中间值和findVal进行对比
int tem = arr[mid];
//如果中间值小于findVal这说明需要查找的值只可能在arr[min]右边,向右递归
if (arr[mid] < findVal) {
return binarySearch(arr, mid + 1, right, findVal);
} else if (arr[mid] > findVal) {
//如果中间值大于findVal这说明需要查找的值只可能在arr[min]左边,向左递归
return binarySearch(arr, left, mid - 1, findVal);
} else {
return mid;
}
}
//查找所有值为findVal的序号
private static List<Integer> binarySearchIndexList(int[] arr, int left, int right, int findVal) {
//如果没有找到返回-1
if (left > right) {
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
//用中间值和findVal进行对比S
//如果中间值小于findVal这说明需要查找的值只可能在arr[min]右边,向右递归
if (arr[mid] < findVal) {
return binarySearchIndexList(arr, mid + 1, right, findVal);
} else if (arr[mid] > findVal) {
//如果中间值大于findVal这说明需要查找的值只可能在arr[min]左边,向左递归
return binarySearchIndexList(arr, left, mid - 1, findVal);
} else {
List<Integer> resIndexList = new ArrayList<Integer>();
int temp = mid - 1;
//向左遍历找是否还有与findVal相同的元素
while (temp >= 0 && arr[temp] == findVal) {
resIndexList.add(temp);
temp--;
}
resIndexList.add(mid);
//向右遍历找是否还有与findVal相同的元素
temp=mid+1;
while (temp <= arr.length-1 && arr[temp] == findVal) {
resIndexList.add(temp);
temp++;
}
return resIndexList;
}
}
}
二分查找算法
最新推荐文章于 2023-04-05 22:35:33 发布