折半查找

 · 2022-7-22 · 次阅读


根据王道教材编写的折半查找的示例代码。

折半查找的题目示例:

P2249

/*
	时间:2022年7月22日21:06:51
	作者:Mythe
	根据王道书上的代码,写的折半查找的示例代码。
*/
# include <stdio.h>
# include <stdlib.h>

typedef struct List {
	int * data;
	int length;
}List, *SeqList;

// 将数据初始化为从0到1000
void InitList(SeqList L)
{
	L->data = (int *)malloc(sizeof(int) * 1001);
	L->length = 0;

	int i = 0;
	for (i=0; i<1000; i++) {
		L->data[L->length] = i + 1;
		L->length++;
	}
	return;
}

int BinarySearch(SeqList L, int key)
{
	int i = 0;
	int low = 0, high = L->length - 1;
	int middle = 0;
	while (low <= high) {
		middle = (low + high) / 2;		// 计算middle的值为两者中心
		int val = L->data[middle];
		printf("第%2d次比较,low=%3d,high=%3d,middle=%3d,数值:%3d,结果:", i++, low, high, middle, L->data[middle]);
		if (val < key) {
			low = middle + 1;			// 如果给定的值比当前中心位置大,则让low指针指向middle的下一个位置
		} else if (val > key) {
			high = middle - 1;			// 如果给定的值比当前中心位置小,则让high指针指向middle的上一个位置
		} else {
			printf("成功。\n");
			return middle;
		}
		printf("失败。\n");
	}
	// 当low的值大于high的值时,while循环退出,此时说明没有查找到目标的值,返回-1。
	return -1;
}

int main(void)
{
	int key;
	SeqList L = (SeqList)malloc(sizeof(List));
	printf("----- 折半查找演示程序 ------\n");
	printf("顺序表存放1-1000之间的整数,请输入你要查找的数:");
	InitList(L);
	scanf("%d", &key);
	printf("index = %d\n", BinarySearch(L, key));
	
	return 0;
}

运行截图:

image.png