查找

实验目的

  1. 掌握各种查找的基本思想和算法实现。
  2. 掌握各种查找方法的好坏及所适应的不同场合

实验内容

  1. 随机产生1000个整数。
  2. 用顺序查找和二分查找算法查找给定的数据,并统计查找的次数。
    实验代码
#include "stdio.h"
#include "iostream.h"
#include "stdlib.h"
#include "time.h"

const int size = 1000;
typedef long RecType;
typedef struct
{
	RecType rec[size + 1];
	int      n;
} SqTable;

//顺序查找
void SeqSearch(SqTable R, RecType k, int &i, int &j)
{
	for (int i = 0; i < len; i++)
		if (x == a[i])
			return i;
	return -1;
}
void main()
{
	int i;
	int x, f;
	for (i = 0; i < N; i++)
		printf("%d\t", a[i]);































	printf("\n");
	printf("Input a number\n");
	scanf("%d", &x);
	f = sequentialSearch(a, N, x);
	if (f == -1)
		printf("没有找到\n");
	else
		printf("%d在数组的下标是%d\n", x, f);
}


//折半查找
int BinSearch(SqTable R, RecType k, int &j)
{
	int low = 1;//初始状态 low 指针指向第一个关键字
	int high = ST->length;//high 指向最后一个关键字
	int mid;
	while (low <= high) {
		mid = (low + high) / 2;//int 本身为整形,所以,mid 每次为取整的整数
		if (ST->elem[mid].key == key)//如果 mid 指向的同要查找的相等,返回 mid 所指向的位置
		{
			return mid;
		}
		else if (ST->elem[mid].key>key)//如果mid指向的关键字较大,则更新 high 指针的位置
		{
			high = mid - 1;
		}
		//反之,则更新 low 指针的位置
		else {
			low = mid + 1;
		}
	}
	return 0;
}
int main(int argc, const char * argv[]) {
	SSTable *st;
	Create(&st, 11);
	getchar();
	printf("请输入查找数据的关键字:\n");
	int key;
	scanf("%d", &key);
	int location = Search_Bin(st, key);
	//如果返回值为 0,则证明查找表中未查到 key 值,
	if (location == 0) {
		printf("查找表中无该元素");
	}
	else {
		printf("数据在查找表中的位置为:%d", location);
	}
	return 0;
}

void main()
{
	SqTable R, A;
	RecType x;
	int i, j, n;
	int k;
	do
	{
		printf("\n\n\n\n");
		printf("\t\t         查找子系统\n");
		printf("\t\t*****************************\n");
		printf("\t\t*       1----产生数据     *\n");
		printf("\t\t*       2----顺序查找    *\n");
		printf("\t\t*       3----二分查找    *\n");
		printf("\t\t*       0----返  回    *\n");
		printf("\t\t*****************************\n");
		printf("\t\t   请选择菜单项(0-3):");
		scanf("%d", &k);
		switch (k)
		{
		case 1://随机产生数据
			printf("请输入要产生随机数的个数(n<=%d)n= ", size);
			scanf("%d", &n);
			srand((unsigned)time(NULL));
			for (i = 1; i <= n; i++)
				A.rec[i] = R.rec[i] = rand();
			A.n = R.n = n;
			break;
		case 2://顺序查找
			printf("请输入要查找的关键字:");
			scanf("%ld", &x);
			SeqSearch(R, x, i, j);
			if (i == 0)	printf("没有此数据!!!");
			else	printf("在 %d 个下标,第 %d 次找到。", i, j);
			break;
		case 3://二分查找
			sort(A, n);
			print(A, n);
			printf("请输入要查找的关键字:");
			scanf("%ld", &x);
			j = 0;
			i = BinSearch(A, x, j);
			if (i == 0)	printf("没有此数据!!!");
			else	printf("在 %d 个下标,第 %d 次找到。", i, j);

			break;
	} while (k != 0);
}

实验结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值