二分查找
二分查找又叫折半查找要求待查找的序列有序。
每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字
- 这里贴出(递归-非递归)两种方式
/**
* 非递归方式
* @param srcArray 数组集
* @param key 查找的key
* @return
*/
public static int binSearch(int srcArray[], int key) {
int mid, start = 0;
int end = srcArray.length - 1;
while (start <= end) {
mid = (end - start) / 2 + start;
if (key < srcArray[mid]) {
//向左查找
end = mid - 1;
} else if (key > srcArray[mid]) {
//向右查找
start = mid + 1;
} else {
return mid;
}
}
return -1;
}
/**
* 递归方式
* @param srcArray 数组集
* @param numKey 查找的key
* @param start 开始节点
* @param end 尾部节点
* @return
*/
public static int binarySearch(int[] srcArray, int numKey, int start, int end) {
int mid = (end - start) / 2 + start;
if (start > end) return -1;
if (numKey < srcArray[mid]) {
return binarySearch(srcArray, numKey, start, mid - 1);
} else if (numKey > srcArray[mid]) {
return binarySearch(srcArray, numKey, mid + 1, end);
} else {
return mid;
}
}
运行结果:
public static void main(String[] args) {
int srcArray1[] = {3, 13, 23, 33, 43, 53, 63, 73, 83, 93, 103, 203, 303, 403, 1003};
System.out.println("递归方式:"+binarySearch(srcArray1, 53, 0, srcArray1.length - 1));
System.out.println("========================================");
System.out.println("非递归方式:"+binSearch(srcArray1, 1003));
}
递归方式:5
========================================
非递归方式:14