1. 折半查找 (10分)- 太简单

  1. 折半查找 (10分)- 太简单
成绩10开启时间2019年12月1日 星期日 18:00
折扣0.8折扣时间2019年12月25日 星期三 23:55
允许迟交关闭时间2020年01月1日 星期三 23:55

折半查找的查找过程:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。

每条待查记录包含关键字项和其他项,如关键字项为15,其他项为该记录在查找表里的原序号4。

对无序表的查找,还需要事先排列成有序表,再进行折半查找。

输入:

5 (记录的条数)

各记录项:如 32 1

输出:

已按关键字排列好的非递减序列:如 (16 2)(20 5)(32 1)(35 3)(91 4)

找不到时输出: error

#include <stdio.h>
int data[1024][2];
void swap(int a, int b)
{
	int i, temp;
	for (i = 0; i < 2; i++)
	{
		temp = data[a][i];
		data[a][i] = data[b][i];
		data[b][i] = temp;
	}
}
void qsort(int begin, int end)
{
	if (begin < end)
	{
		int i, j;
		i = begin + 1;
		j = end;
		while (i < j)
		{
			if (data[i][0] > data[begin][0])
				swap(i, j--);
			else
				i++;
		}
		if (data[i][0] > data[begin][0])
			i--;
		swap(begin,i);
		qsort(begin, i);
		qsort(j, end);
	}
}
int main()
{
	int i, n, testnum, compare[3] = {0}, flag = -1, temp;
	scanf("%d", &n);
	compare[1] = n / 2;
	compare[2] = n - 1;
	for (i = 0; i < n; i++)
		scanf("%d%d", &data[i][0], &data[i][1]);
	qsort(0, n - 1);
	for (i = 0; i < n; i++)
		printf("(%d %d)", data[i][0], data[i][1]);
	printf("\n");
	scanf("%d", &testnum);
	while (1)
	{
		if (testnum < data[compare[0]][0] || testnum > data[compare[2]][0])
			break;
		if (testnum == data[compare[1]][0])
		{
			flag = compare[1];
			break;
		}
		else if (testnum < data[compare[1]][0])
		{
			compare[2] = compare[1];
			compare[1] = (compare[0] + compare[1]) / 2;
		}

		else
		{
			compare[0] = compare[1];
			temp = (compare[1] + compare[2]) / 2;
			if (temp == compare[1])
				break;
			compare[1] = temp;
		}
	}
	if (flag == -1)
		printf("error\n");
	else
		printf("(%d %d)\n",data[flag][0],data[flag][1]);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值