二分法查找实现

二分法查找是最简单的查找方法之一,其效率也是很不错的(对于有序的),其时间复杂度为,它每一次查找后就能将查找范围缩小一半。

wiki给的概念:

计算机科学中,折半搜索,也称二分查找算法二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

例如:

有序序列: 0 ,1,2,3,4,5,6,7,8,9.

 假定用一维数组array[10]存储在这有序序列.用low,high,mid作为数组array的下标,key为要找到关键字。

当array[mid] = key;时为找到关键字key.

        则:

        如果查找其中关键字key的数值为2:

设定low = 0,high = 9;mid = (low+high)/2;

所以mid = 4;(C 语言中对于整数除法用类似于数论中的高斯函数取值。)

         第一次查找后:

               因为array[4] = 4; key = 2;

即  key

所以限定下一次在数组查找范围是下标0~mid-1;(因为我们假定当array[mid] = key;时为找到关键字key.因此向下移动一位)

     则:

low = 0,high = mid-1 = 4 - 1= 3;

mid = 1;

第二次查找后:

array[mid] = array[1] = 1;

即 key>array[mid];

所以下一次的在数组查找范围是下标:mid+1 ~ 3;

则:

low = mid+1 = 2; high = 3;

mid = 2;

而array[mid] = array[2] = key;

已经查找到;


代码实现(C语言):

#include "stdio.h"

//递归二分法查找
void HalfSearch(int *array,int low,int high,int key)
{
	if(low>high)
	{
		printf("没有你要查找的数.\n");
		return ;
	}
	if(key == array[mid])
	{
		printf("在有序序列第%d处查找到!\n",mid);
		return ;
	}
	else if(key > array[mid])
		HalfSearch(array,mid+1,high,key);
	else if(key < array[mid])
		HalfSearch(array,low,mid-1,key);
}

int main(void)
{
	int a[] = {0,1,2,3,4,5,6,7,8,9};

	HalfSearch(a,0,9,3);
	HalfSearch(a,0,9,9);
	HalfSearch(a,0,9,1);
	HalfSearch(a,0,12,0);
	HalfSearch(a,0,9,19);
	HalfSearch(a,0,9,-9);
	return 0;
}


非递归:

#include "stdio.h"

void HalfSearch(int *array,int low,int high,int key)
{
	while(low<=high)
	{
		int mid = (low + high)/2;

		if(key == array[mid])
		{
			printf("在有序序列第%d处查找到!\n",mid);
			return ;
		}
		else if(key > array[mid])
			low = mid + 1;
		else
			high = mid - 1;
	}

	if(low>high)
		printf("没有你要查找的数.\n");

	return ;
}

int main(void)
{
	int a[] = {0,1,2,3,4,5,6,7,8,9};

	HalfSearch(a,0,9,3);
	HalfSearch(a,0,9,9);
	HalfSearch(a,0,9,1);
	HalfSearch(a,0,12,0);
	HalfSearch(a,0,9,19);
	HalfSearch(a,0,9,-9);
	return 0;
}

运行实现:

二分法查找实现_第1张图片


你可能感兴趣的:(尝试)