优化:
package org.mobiletrain;
import java.util.Comparator;
//Collections工具类
public class Test01 {
//折半查找
public static <T extends Comparable<T>> int binarySearch(T[] array,T key){
int start = 0;
int end = array.length - 1;
while(start <= end){
int mid = (end - start) / 2 + start;
if (array[mid].equals(key)) {
return mid;
}
else if (array[mid].compareTo(key) > 0) {
end = mid - 1;
}
else {
start = mid + 1;
}
}
return -1;
}
public static <T> int binarySearch(T[] array,T key,Comparator<T> comp){
int start = 0;
int end = array.length - 1;
while(start <= end){
//int mid = (start + end) / 2; //有溢出的风险
int mid = (end - start) / 2 + start;
// int mid = (start + end) >>> 1; //逻辑右移(不带符号位的右移)
if (array[mid].equals(key)) {
return mid;
}
else if (comp.compare(array[mid],key) > 0) {
end = mid - 1;
}
else {
start = mid + 1;
}
}
return -1;
}
}
更优化:
class Hello {
public static <T extends Comparable<T>> int binarySearch(T[] array, T key) {
return _binarySearch(array, key, 0, array.length - 1);
}
private static <T extends Comparable<T>> int _binarySearch(T[] array, T key, int start, int end) {
if (start <= end) {
int mid = (start + end) >>> 1;
if (key.compareTo(array[mid]) < 0) {
return _binarySearch(array, key, start, mid - 1);
} else if (key.compareTo(array[mid]) > 0) {
return _binarySearch(array, key, mid + 1, end);
} else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
String[] x = { "apple", "banana", "grape", "pitaya", "watermelon" };
System.out.println(binarySearch(x, "grape"));
System.out.println(binarySearch(x, "orange"));
System.out.println(binarySearch(x, "apple"));
}
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。