簡介
二分法查找(Binary Search)又稱爲折半查找(Half-Interval Search),是一種針對有序數列的查找方法。
時間複雜度
每次把搜索區域減少一半
最差:
最優:
空間複雜度
迭代:
遞歸:
工作原理如下:
- 判斷查找範圍最大值與最小值是否相等:
- 如果相等,則取查找範圍下標的中間值,並與所需要的查找的值進行比較:
- 如果等於,則該中間值的下標就是所要查找的值的下標,即找到該值並返回下標。
- 如果大於,則需要查找的值在中間值的左邊,將查找範圍最大值設置爲中間值,然後重複第一個步驟。
- 如果小於,則需要查找的值在中間值的右邊,將查找範圍最小值設置爲中間值,然後重複第一個步驟。
- 如果不相等,即未查找到所需要查找的值並返回-1或錯誤碼。
- 如果相等,則取查找範圍下標的中間值,並與所需要的查找的值進行比較:
C++實現
#include <stdio.h>
//非遞歸實現
int BinarySearch(int numbers[], int length, int value)
{
int begin = 0;
int end = length - 1;
int mid = 0;
while (begin < end)//當沒有可查詢的元素時退出
{
mid = (begin + end) / 2;//平分數組
if (numbers[mid] == value)
{
return mid;//查找到返回下標
}
else if (numbers[mid] > value)
{
end = mid;//需要查找到的數在左邊
}
else
{
begin = mid;//需要查找到的數在右邊
}
}
return -1;
}
//遞歸實現
int BinarySearchRecursively(int numbers[], int begin, int end, int value)
{
if (begin >= end)//當沒有可查詢的元素時退出
{
return -1;
}
int mid = (begin + end) / 2;//平分數組
if (numbers[mid] == value)
{
return mid;//查找到返回下標
}
else if (numbers[mid] > value)
{
end = mid;//需要查找到的數在左邊
}
else
{
begin = mid;//需要查找到的數在右邊
}
return BinarySearchRecursively(numbers, begin, end, value);//繼續遞歸
}
void main()
{
int numbers[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
int value = 17;
printf("Index1 = %d\n", BinarySearch(numbers, 20, value));
printf("Index2 = %d\n", BinarySearchRecursively(numbers, 0, 19, value));
}