题目
1.4.10 修改二分查找算法,使之总是返回和被查找的键匹配的索引最小的元素。(且仍能够保证对数级别的运行时间)
1.4.10 Modify binary search so that it always returns the element with the smallest index that matches the search element (and still guarantees logarithmic running time).
代码
package homework1_4;
/**
* @description: ${description}
* @create: 2019-03-05
**/
public class W_1_4_10 {
//数组a必须是有序的,原始二分查找法
public static int rank(int key, int[] a) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] < key) {
low = mid + 1;
} else if (a[mid] > key) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
//1.4.10的做法1 ,一般情况可以满足对数
public static int rank1(int key, int[] a) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] < key) {
low = mid + 1;
} else if (a[mid] > key) {
high = mid - 1;
} else {
while (a[mid] == a[mid - 1]) {
mid--;
if (mid < 0) {
break;
}
}
return mid;
}
}
return -1;
}
//1.4.10的做法2 高级改进版本
public static int rank2(int key, int[] a) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] < key) {
low = mid + 1;
} else if (a[mid] > key) {
high = mid - 1;
} else if (a[mid - 1] == a[mid] && mid > 0) {
high = mid;
} else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
int key = 5;
int[] a = {1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 11};
System.out.println(rank(key, a));
System.out.println(rank1(key, a));
System.out.println(rank2(key, a));
}
}