数据结构之顺序查找(Sequential Search)

查找:
就是在数据中寻找特定的值,这个值称为“关键码(key)”。


查找的目的:
就是为了确定数据中是否存在与关键码相同的数据。


一句数据是否已排序,查找的方法也会不同。以下给出了四种不同的查找方法。
顺序查找法
折半查找法
裴波那契查找法
插补查找法


其中顺序查找法是使用未经排序的数据。
另外三种方法都需要将数据先排序好后,然后才能使用。


除了上述的四种查找方法外,在有另两种查找方法:二叉树查找法和散列法。
这两种方法处理的数据结构不一定是数组,可以使用二叉树或者链表结构,这些查找数据都需要先行处理,存储在使用的数据结构后,
才能进行查找的操作。


1.顺序查找法(Sequential Search)
该查找法就如同数组的遍历,从数组的第一个元素开始,检查数组的每一个元素,以便确定是否有查找的数据。
由于是从头检查到尾,所以数组数据是否已经排序已经不重要。


例如:
先使用随机函数生成100个不相同的结构数据元素,然后输入数字,使用顺序查找法找到这个数字,若存在,输出数组索引,若不存在,就直接

输出信息直到输入的数字为-1为止。

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 100

typedef struct element
{
	int key;
}record;

record data[MAX];

int seq_search(int key)
{
	int pos;

	pos = 0;
	while(pos < MAX)
	{
		if(key == data[pos].key)
			return pos;
		pos++;
	}
	return -1;
}

int main(int argc, char **argv)
{
	int checked[300];
	int i, temp;
	long temptime;
	srand(time(&temptime) % 60);

	for(i = 0; i < 300; i++)
		checked[i] = 0;

	i = 0;

	while(i != MAX)
	{
		temp = rand() % 300;

		if(checked[temp] == 0)	//用于检查是否有重复的值
		{
			data[i].key = temp;
			checked[temp] = 1;
			i++;
		}
	}

	while(1)
	{
		printf("\n请输入查找值(0-299) ==> ");
		scanf("%d", &temp);
		if(temp != -1)
		{
			i = seq_search(temp);
			if(i != -1)
				printf("找到查找值:%d[%d]\n", temp, i);
			else
				printf("没有找到查找值:%d\n", temp);
		}
		else
			exit(1);
	}

	system("pause");
	return 0;
}

注:

标准C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。
rand()函数没有输入参数,直接通过表达式rand()来引用;例如可以用下面的语句来打印两个随机数:
  printf("Random numbers are: %i %i\n",rand(),rand());
因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机。
为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的随机种子。函数 srand()(来自stdlib.h)可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。引自于:http://baike.baidu.com/view/3048977.htm

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值