写代码可以在整型有序数组中查找想要的数字, 找到了返回下标,找不到返回-1。
具体思路我写一下。
1.首先我们我们要查找一个数组元素所对应的下标,我们可以一个一个去比对,但是这样明显费时费力,这样我们就引入了折半查找的方法。
- 折半查找(在计算机科学中,二分搜索(英语:binary search),用于对数搜索,还有是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。)。
2.如果要进行折半查找,那我们就要找到一个数组的最左边和最右边下标,最左边下标当然是0,那么最右边的是什么?其实就是数组元素的个数减一。如果不知道数组元素具体个数,那我们就可以用
int len = sizeof(arr) / sizeof(arr[0])来求得,再减一就是最右边下标。
3.那么中间元素对应的下标就是mid=(left+right)/2 然后mid对应的元素与要查找的值对比,若比要查找的值大,那么就将right变为mid-1,这样查找的范围缩小一半,若小于,则将left变为mid+1,依次下去,直到找到为止,这样大大加快了速度。
下面则是具体实现代码。
#include<stdio.h>
#include<stdlib.h>
int BinarySearch(int arr[], int left, int right, int key)
{
while (left <= right) //进行一个循环。
{
int mid = (right + left) / 2; //折半后的元素为最左边的元素,与最右边的元素相加除2.
if (arr[mid] > key) //将数组中间元素对应的值与要比较的值相比较。
{
right = mid - 1; //若大于,则猜大了,将mid-1赋值给right。
}
else if (arr[mid] < key)
{
left = mid + 1; //若小于,将mid+1赋值给left。
}
else
{
return mid; //若想等返回mid,即猜中了。
}
}
return -1; //若都没有,返回-1。
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int len = sizeof(arr) / sizeof(arr[0]); //求数组的长度。
int index = BinarySearch(arr, 0, len - 1, 6); //调用 BinarySearch函数。
printf("%d\n", index);
system("pause");
return 0;
}