public class binarySearch {
/**
* 循环二分查找
* @param array
* @return
*/
public static List<Integer> arraySearch(int[] array, int value){
List<Integer> resultList = Lists.newArrayList();
int low = 0, high = array.length - 1, middle = 0;
if(high < low || array == null || array.length == 0){
resultList.add(-1);
return resultList;
}
while(low <= high){
middle = (high + low) >>1;
if(value == array[middle]){
resultList.add(middle);
break;
} else if(value < array[middle]){
high = middle -1;
}else if(value > array[middle]){
low = middle + 1;
}
}
int temp = middle - 1;
while(true){
if(temp < 0 || value != array[temp] || temp < low){
break;
}
resultList.add(temp);
temp--;
}
temp = middle +1;
while(true){
if(temp > array.length -1 || value != array[temp] || temp > high){
break;
}
resultList.add(temp);
temp++;
}
return resultList;
}
/**
* 递归二分查找
* @return
*/
public static List<Integer> recursionSearch(int[] array, int value, int low, int high){
int middle = (low + high) >>1;
List<Integer> resultList = Lists.newArrayList();
if(high < low || array == null || array.length == 0){
resultList.add(-1);
return resultList;
}
while(low <= high){
if(value == array[middle]){
resultList.add(middle);
break;
} else if (value < array[middle]) {
return recursionSearch(array, value, low, middle - 1);
} else if (value > array[middle]) {
return recursionSearch(array, value, middle + 1, high);
}
}
int temp = middle - 1;
while(true){
if(temp < 0 || value != array[temp] || temp < low){
break;
}
resultList.add(temp);
temp--;
}
temp = middle +1;
while(true){
if(temp > array.length -1 || value != array[temp] || temp > high){
break;
}
resultList.add(temp);
temp++;
}
return resultList;
}
public static void main(String[] args) {
int[] array = {4, 4, 4, 7, 9, 11, 11};
//循环
List<Integer> search = arraySearch(array, 11);
System.out.println(search);
//递归
List<Integer> recursionSearch = recursionSearch(array, 4, 0, array.length -1);
System.out.println(recursionSearch);
}
}
二分查找算法(元素可重复)
最新推荐文章于 2024-01-22 15:33:24 发布