二分查找
算法思想:又叫折半查找,要求待查找的序列有序。每次取中間位置的值與待查關鍵字比較,如果中間位置的值比待查關鍵字大,則在前半部分循環這個查找的過程,如果中間位置的值比待查關鍵字小,則在後半部分循環這個查找的過程。直到查找到了爲止,否則序列中沒有待查的關鍵字。
1.非遞歸實現
/**
* 非遞歸二分查找法
* @param array 查詢的數組
* @param find 要查找的值
* @return 值在數組中的位置
*/
public static int search(int[] array, int find){
if(array == null){
return -1;
}
int start = 0;
int end = array.length - 1;
int middle = 0;
while(start <= end){
middle = (start + end) / 2;//中間的位置
if(array[middle] == find){//中間值等於要查找的值,直接返回
return middle + 1;
}else if(array[middle] < find){//中間值小於要查找的值,就在中間值後面繼續查找
start = middle + 1;
}else{//中間值大於要查找的值,就在中間值前面繼續查找
end = middle -1;
}
}
return -1;//未查找到,返回-1
}
2.遞歸實現
/**
* 遞歸二分查找法
* @param array 查詢的數組
* @param start 開始位置
* @param end 結束位置
* @param find 要查找的值
* @return 值在數組中的位置
*/
public static int search(int[] array, int start, int end, int find){
if(array == null){
return -1;
}
int middle = (start + end) / 2;//中間的位置
if(start <= end){
if(array[middle] == find){//中間值等於要查找的值,直接返回
return middle + 1;
}else if(array[middle] < find){//中間值小於要查找的值,就在中間值後面繼續查找
return search(array, middle + 1, end, find);
}else{//中間值大於要查找的值,就在中間值前面繼續查找
return search(array, start, middle -1, find);
}
}
return -1;//未查找到,返回-1
}