二分查找
package com.haoran.learn.sort;
import java.util.*;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 6, 6, 6, 7};
ArrayList<Integer> indexVal = binarySearch(arr, 0, arr.length - 1, 6);
if (indexVal.size() != 0) {
Collections.sort(indexVal);
}
System.out.println(indexVal);
}
public static ArrayList<Integer> binarySearch(int[] arr, int left, int right, int findVal) {
if (left > right) {
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
ArrayList<Integer> list = new ArrayList<>();
if (midVal < findVal) {
return binarySearch(arr, mid + 1, right, findVal);
} else if (midVal > findVal) {
return binarySearch(arr, left, mid - 1, findVal);
} else {
/*
* 1. 在找到mid 索引值,不要马上返回
* 2. 向mid 索引值的左边扫描,将所有满足 findVal, 的元素的下标,加入到集合ArrayList
* 3. 向mid 索引值的右边扫描,将所有满足 findVal, 的元素的下标,加入到集合ArrayList
* 4. 将Arraylist返回*/
int temp = mid - 1;
while (true) {
//说明不相等或者左边已经查找完
if (temp < 0 || arr[temp] != findVal) {
break;
}
list.add(temp);
temp -= 1;
}
list.add(mid);
temp = mid + 1;
while (true) {
//说明不相等或者左边已经查找完
if (temp > right - 1 || arr[temp] != findVal) {
break;
}
list.add(temp);
temp += 1;
}
return list;
}
}
}
输出结果:
[5, 6, 7, 8]