数据结构之折半查找法(Binary Search)

对于要查找的数据已经排序,此时仍然可以使用顺序查找法来进行查找,但是此时有更加简便的方法,
那就是“折半查找法(Binary Search)”。


折半查找法的实现步骤如下:
假设数组的上下范围分别为low和high,则此时中间元素是(low + hihg) / 2。在进行查找时。
1.如果查找关键码小于数组的中间元素,则关键码在数据数组的前半部。
2.如果查找关键码大于数组的中间元素,则关键码在数据数组的后半部。
3.如果查找关键码等于数组的中间元素,则中间元素就是查找的值。


对于如下的例子:
1, 2, 3, 4, 5, 6, 7, 8, 9


若要查找的整数是8,则
第一步是与中间的元素索引4的值5进行比较。因为8>5,所以在后半段进行查找,
后半段如下 6, 7, 8, 9


第二步是与中间的元素索引是6的值7进行比较,因为8>7,所以继续在后半段进行查找,
后半段如下:8,9


第三步,此时的中间元素的索引是7的值8,即为我们我查找的值。


代码实现如下:

/*
File Name: Binary Search
Data Time:
Anthor:
*/
#include <stdio.h>
#include <stdlib.h>

#define MAX 21

typedef struct element
{
	int key;
}record;

record data[AMX] = {
	2, 5, 7, 9, 17, 21, 25,
	33, 46,89,100, 121, 127, 139,
	237, 279, 302, 356, 455, 467, 500};

//
int binary_find(int key, int low, int high)
{
	int mid;
	
	if(low == high)
	{
		if(data[low].key == key)
			return low;
		else
			return -1;
	}
	else
	{
		mid = (low + high) / 2;
		if(mid == low);
			mid++;
		if(key < data[mid].key)
			return binary_find(key, low, mid - 1);
		else
			return binary_find(key, mid, high);
	}
}
//Binary Search
int binary_search(int key)
{
	return binary_find(key, 0, MAX - 1);
}

int main(int argc, char** argv)
{
	int found;
	int value;
	
	while(1)
	{
		printf("\n请输入查找值(0-500) ==> ");
		scanf("%d", &value);
		if(value != -1)
		{
			found = binary_search(value);
			if(found != -1)
			{
				printf("找到查找值: %d[%d]\n", value, found);
			}
			else
			{
				printf("没有哦找到查找值: %d\n", value);
			}
		}
		else
			exit(1);
	}
	
	system("pause");
	return 0;
}

此处是使用递归的方式实现的折半查找。

以下可以通过使用非递归的方式实现折半查找

代码实现如下:

/*
File Name: Binary Search
Data Time:
Anthor:
*/
#include <stdio.h>
#include <stdlib.h>

#define MAX 21

typedef struct element
{
	int key;
}record;

record data[MAX] = {
	2, 5, 7, 9, 17, 21, 25,
	33, 46,89,100, 121, 127, 139,
	237, 279, 302, 356, 455, 467, 500};

int binary_search(int key, int low, int high)
{
	int mid;

	while(low <= high)
	{
		mid = (low + high) / 2;
		if(key < data[mid].key)
			high = mid - 1;
		else
			if(key > data[mid].key)
				low = mid + 1;
			else
				return mid;
	}
	return -1;
}

int main(int argc, char** argv)
{
	int found;
	int value;
	
	while(1)
	{
		printf("\n请输入查找值(0-500) ==> ");
		scanf("%d", &value);
		if(value != -1)
		{
			found = binary_search(value, 0, MAX - 1);
			if(found != -1)
			{
				printf("找到查找值: %d[%d]\n", value, found);
			}
			else
			{
				printf("没有哦找到查找值: %d\n", value);
			}
		}
		else
			exit(1);
	}
	
	system("pause");
	return 0;
}


你可能感兴趣的:(数据结构之折半查找法(Binary Search))