java排序--折半查找

1.概念:

折半查找,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

2.代码一:

/**

 * 

 * @param x 被查找的数组(有序)

 * @param key 查找特定的元素

 * @return 找到元素返回元素在数组中的位置,没有找到就返回-1

 */

public static <T extends Comparable<T>> int binarySearchsort(T[] x, T key) {

 

int low = 0;//起点元素

int hight = x.length - 1;//终点元素

 

while (low <= hight) {

//中间元素

int mid = low + ((hight - low) >> 1);

//如果要查找的元素等于中间元素

if (key.compareTo(x[mid]) == 0) {

return mid;

//如果要查找的元素大于中间元素 ,low=mid+1

} else if (key.compareTo(x[mid]) > 0) {

low = mid + 1;

//如果要查找的元素小于中间元素 ,hight = mid-1

} else if (key.compareTo(x[mid]) < 0) {

hight = mid -1;

}

}

return -1;

}

3.代码二:

递归实现

private static<T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {

if(low <= high) {

int mid = low + ((high - low) >> 1);

if(key.compareTo(x[mid]) == 0) {

return mid;

}

else if(key.compareTo(x[mid]) < 0) {

return binarySearch(x, low, mid - 1, key);

}

else {

return binarySearch(x, mid + 1, high, key);

}

}

return -1;

}

}

 

 

注意:计算中间位置时,不应该使用(high + low) / 2的方式,因为加法运算可能导致整数越界,这里应该使用一下三种方式之一:low + (high  low) / 2low + (high  low) >> 1或(low + high) >>> 1(注:>>>是逻辑右移,不带符号位的右移)

 

 

 

 

你可能感兴趣的:(java,折半查找)