折半查找法的应用。

写代码可以在整型有序数组中查找想要的数字, 找到了返回下标,找不到返回-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
#include
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;
}

你可能感兴趣的:(折半查找法的应用。)