查找——顺序查找

###一、顺序查找的概念 顺序查找(Sequential Search)是最简单的一种查找方法。其基本思想是:从线性表的一端开始,依次将每个记录的关键字与给定值进行比较,若某个记录的关键字等于给定值,表示查找成功,返回记录序号;若将线性表中所有记录都比较完,仍未找到关键字与给定值相等的记录,则表示查找失败,返回一个查找失败的标志值

###二、顺序查找的实现 ####顺序查找

/**
 *简单的顺序查找
 * */
int SeqSearch(int s[], int n, int key)
{
	int i;
	for (i=0; i<n && s[i]!=key; i++)	//循环查找关键字
		;	// 空循环

	if (i<n)	//查找成功,返回序号
		return i;
	else		//查找失败,返回失败值
		return -1;
}

####顺序查找测试

#include <stdio.h>
#include "SeqSearch.c"
#define ARRAYLEN 8

int main()
{
	int key, i, pos;

	int source[ARRAYLEN] = {69, 65, 90, 37, 92, 6, 2};
	printf("请输入查找关键字:");
	scanf("%d", &key);
	pos = SeqSearch(source, ARRAYLEN, key);

	printf("原数据:");
	for (i=0; i< ARRAYLEN; i++)
		printf("%d ", source[i]);
	printf("\n");

	if (pos > 0)
		printf("查找成功,关键字%d位于数组的第%d个位置\n", key, pos);
	else
		printf("查找成功,关键字%d不在数组中\n", key);
}

###三、顺序查找简单优化 在以上的SeqSearch函数中,第7~8行是顺序查找的主要部分,在这部分循环语句中,每循环一次 都需要进行两个比较(i<n和r[i]!=key),如果静态查找表中的数据很多,两次比较则需要进行较长时间,程序的效率会显著降低。这时,可对SeqSearch算法进行改进,在创建静态查找表时,在该表的末端增加一个空的单元,用来保存查找的关键字。这样,确保静态查找表中有一个与查找关键字相同的数据,就不需要使用条件i<n进行判断了。每次查找时,查找表中总是能找到关键字,怎样判断是否查找成功呢?其实,只需要判断,若是找了n+1个元素才找到关键值,则表示查找失败

####SeqSearch函数优化

int SeqSearch(int s[], int n, int key)
{
	int i;
	for (i=0; s[i]!=key; i++)	//循环查找关键字
		;	// 空循环

	if (i<n)	//查找成功,返回序号
		return i;
	else		//查找失败,返回失败值
		return -1;
}

####SeqSearch函数优化后测试

#include <stdio.h>
#include "SeqSearch.c"
#define ARRAYLEN 8

int main()
{
	int key, i, pos;

	int source[ARRAYLEN+1] = {69, 65, 90, 37, 92, 6, 2};
	printf("请输入查找关键字:");
	scanf("%d", &key);
	source[ARRAYLEN+1] = key;
	pos = SeqSearch1(source, ARRAYLEN+1, key);

	printf("原数据:");
	for (i=0; i< ARRAYLEN; i++)
		printf("%d ", source[i]);
	printf("\n");

	if (pos >= 0)
		printf("查找成功,关键字%d位于数组的第%d个位置\n", key, pos);
	else
		printf("查找失败,关键字%d不在数组中\n", key);
}

###四、顺序查找的特点 优点:对静态查找表中数据的顺序没有要求。若需要创建动态查找表,可以方便地将查找不成功的数据添加到查找表的末尾。 缺点:速度慢,在最坏的情况下,查找成功需要进行n次比较,查找失败需要进行n+1次比较。

转载于:https://my.oschina.net/wangande2014/blog/701304

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值