在一个给定的整形有序数组中查找想要的数字,使用折半查找找到后返回该元素的下标,找不到则返回-1.
在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
假设一个数组中由1~10是个元素有序排列组成,上表第一行为元素,第二行为下标数。
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int key = 6; //key表示要查找的元素
int left = 0; //第一个元素的下标
int right = sizeof(arr) / sizeof(arr[0])-1;//最后一个元素的下标
int mid;
while (left <= right)
{
mid = (left + right) / 2; //作为从中间开始查找的下标
if (arr[mid] < key) //在所查找的元素的左边
{
left = mid + 1; //将范围缩小到右边
}
else if (arr[mid]>key) //在所查找的元素的右边
{
right = mid - 1; //将范围缩小到左边
}
else if (arr[mid] == key)
{
break; //找到时跳出循环
}
}
if (arr[mid] == key)
{
printf("下标为: %d\n", mid);
}
else
{
return -1;
}
system("pause");
return 0;
}