折半查找要求数据集合中的元素必须可比较,并且各元素按升序或者降序排列。折半查找的基本思想如下:
取集合的中间元素作为比较对象,则:
(a)如果给定的值与比较对象相等,则查找成功,返回中间元素的序号;
(b)如果给定的值大于比较对象,则在中间元素的左半段进行查找;
(c)如果给定的值小于比较对象,则在中间元素的右半段进行查找;
重复上述过程,直至查找成功。折半算法的平均时间复杂度是。
设计过程:
编写BinSearch类,它有两个方法:search()方法用来在给定的数组array中,查找key的索引位置;
main()方法用来进行测试。代码如下:
public class BinSearch {
public static <T extends Comparable<? super T>> int search(T[] array, T key) {
int low = 0;
int mid = 0;
int high = array.length;
System.out.println("查找的中间值:");
while (low <= high) {
mid = (low + high) / 2;
System.out.print(mid+" ");
if (key.compareTo(array[mid]) > 0) {
low = mid + 1;
} else if (key.compareTo(array[mid]) < 0) {
high = mid - 1;
} else {
System.out.println();
return mid;
}
}
return -1;
}
public static void main(String[] args) {
Integer[] ints = {1,2,3,4,5,6,7,8,9,10};
System.out.println("数据集合:");
System.out.println(Arrays.toString(ints));
System.out.println("元素3所对于的索引序号:"+search(ints, 3));
}
}
效果如下:
编程心法:
泛型在数据结构中的应用。
在学习数据结构的过程中,为了理解方便和简化编程,通常都使用整数作为分析的对象。利用Java的泛型机制,只需要将int替换成泛型类型T就可以实现更加通用的算法。
这样就不需要再对不同的数据类型编写不同的算法实现。