二分查找又稱折半查找,是一種較高效率的查找方法。
優點:比較次數少,查找速度快,平均性能好,佔用系統內存較少。
缺點:要求待查表爲有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
算法要求:
1.必須採用順序存儲結構。
2.必須按關鍵字大小有序排列。
算法思想:
將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如果x小於a[n/2],則我們只要在數組a的左半部繼續搜索x(這裏假設數組元素呈升序排列)。如果x大於a[n/2],則我們只要在數組a的右 半部繼續搜索x
算法實現:
方式一:while循環
public int binarySearch(Integer[] srcArray, int element) {
//定義初始最大、最小索引
int start = 0;
int end = srcArray.length - 1;
//確保不會越界重複查找
while (start <= end && start <= srcArray.length - 1 && end <= srcArray.length - 1) {
//獲取中間索引,若寫爲:middle=(start+end)/2,則會出現在當start+end的結果大於表達式結果類型所能表示的最大值時,
// 這樣產生溢出後再 / 2 是不會產生正確結果的,
int middle = start + (end - start) / 2;
if (element == srcArray[middle]) {
return middle;
//判斷下限
} else if (element < srcArray[middle]) {
end = middle - 1;
//判斷上限
} else {
start = middle + 1;
}
}
//若沒有查找到則返回-1
return -1;
}
方式二:遞歸
public int binarySearch(Integer[] srcArray, int start, int end, int element) {
//獲取中間索引,若寫爲:middle=(start+end)/2,則會出現在當start+end的結果大於表達式結果類型所能表示的最大值時,
// 這樣產生溢出後再 / 2 是不會產生正確結果的,
int middle = start + (end - start) / 2;
if (element == srcArray[middle]) {
return middle;
} else if (start > end) {
return -1;
//判斷下限
} else if (element < srcArray[middle]) {
end = middle - 1;
return binarySearch(srcArray, start, end, element);
//判斷上限
} else {
start = middle + 1;
return binarySearch(srcArray, start, end, element);
}
}