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

本文详细介绍了折半查找算法的基本原理及实现过程,包括如何将无序表转换为有序表,以及通过逐步缩小查找范围来定位目标记录。文章提供了一个完整的C语言实现示例,演示了如何对记录进行排序并执行折半查找。
  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;
}
1. 读取一篇包括标点符号的英文文章(InFile.txt),假设文件中单词的个数最多不超过5000个。从文件中读取单词,过滤掉所有的标点。 2. 别利用线性表(包括基于顺序表的顺序查找、基于链表的顺序查找折半查找)、二叉排序树和哈希表(包括基于开放地址法的哈希查找、基于链地址法的哈希查找)总计6种不同的检索策略构建单词的存储结构。 3. 不论采取哪种检索策略,完成功能均相同。 (1)词频统计 当读取一个单词后,若该单词还未出现,则在适当的位置上添加该单词,将其词频计为1;若该单词已经出现过,则将其词频增加1。统计结束后,将所有单词及其频率按照词典顺序写入文本文件中。其中,不同的检索策略别写入6个不同的文件。 基于顺序表的顺序查找--- OutFile1.txt 基于链表的顺序查找--- OutFile2.txt 折半查找--- OutFile3.txt 基于二叉排序树的查找--- OutFile4.txt 基于开放地址法的哈希查找--- OutFile5.txt 基于链地址法的哈希查找--- OutFile6.txt 注:如果实现方法正确,6个文件的内容应该是一致的。 (2)单词检索 输入一个单词,如果查找成功,则输出该单词对应的频率,同时输出查找成功的平均查找长度ASL和输出查找所花费的时间。如果查找失败,则输出“查找失败”的提示。做一个c++5.11可用的代码
最新发布
06-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值