课程设计题目
实现顺序查找的算法
课程设计目的
领会顺序查找的过程和算法设计
问题描述
编写一个程序,输出在顺序表(3,6,2,10,1,8,5,7,4,9)中采用顺序查找方法查找关键字 5的过程
数据结构及算法设计
顺序查找是一种简单的线性查找算法,它从列表的第一个元素开始,逐个比较每个元素与关键字的大小。如果找到了与关键字相等的元素,就返回该元素的索引;如果遍历完整个列表都没有找到与关键字相等的元素,则返回-1表示未找到。
在给定的顺序表(3,6,2,10,1,8,5,7,4,9)中,采用顺序查找方法查找关键字 5 的过程如下:
1. 从第一个元素开始,比较当前元素与关键字 5 的大小。
2. 当前元素为 3,小于关键字 5,继续比较下一个元素。
3. 当前元素为 6,大于关键字 5,继续比较下一个元素。
4. 当前元素为 2,小于关键字 5,继续比较下一个元素。
5. 当前元素为 10,大于关键字 5,继续比较下一个元素。
6. 当前元素为 1,小于关键字 5,继续比较下一个元素。
7. 当前元素为 8,大于关键字 5,继续比较下一个元素。
8. 当前元素为 5,等于关键字 5,找到了目标元素,返回其索引位置。
因此,关键字 5 在顺序表中的索引位置为 7。
源程序
#include <stdio.h>
#include <malloc.h>
#define MAXL 100 //最大长度
typedef int KeyType; //定义关键字类型为int
typedef char InfoType;
typedef struct
{ KeyType key; //关键字项
InfoType data; //其他数据项,类型为InfoType
} RecType; //查找元素的类型
void CreateList(RecType R[],KeyType keys[],int n) //创建顺序表
{
for (int i=0;i<n;i++) //R[0..n-1]存放排序记录
R[i].key=keys[i];
}
void DispList(RecType R[],int n) //输出顺序表
{
for (int i=0;i<n;i++)
printf("%d ",R[i].key);
printf("\n");
}
int SeqSearch(RecType R[],int n,KeyType k) //顺序查找算法
{
int i=0;
while (i<n && R[i].key!=k)
{
printf("%d ",R[i].key);
i++; //从表头往后找
}
if (i>=n)
return 0;
else
{
printf("%d",R[i].key);
return i+1;
}
}
int main()
{
RecType R[MAXL];
int n=10,i;
KeyType k=5;
int a[]={3,6,2,10,1,8,5,7,4,9};
CreateList(R,a,n); //建立顺序表
printf("关键字序列:"); DispList(R,n);
printf("查找%d所比较的关键字:\n\t",k);
if ((i=SeqSearch(R,n,k))!=0)
printf("\n元素%d的位置是%d\n",k,i);
else
printf("\n元素%d不在表中\n",k);
return 1;
}
数据及结果分析
通过运行程序,我们可以得到在顺序表 (3, 6, 2, 10, 1, 8, 5, 7, 4, 9) 中采用顺序查找方法查找关键字 5 的过程。
体会
顺序查找是一种简单直观的查找算法,适用于已经排序的数据集合。顺序查找算法要求待查找的数据集合是有序的,即每个元素的位置与其值之间存在一种一一对应的关系。如果数据集合无序,则顺序查找的效果会很差,此时可以考虑使用其他更高效的查找算法,如二分查找等。在顺序查找中,需要明确要查找的数据集合的范围。一般情况下,从第一个元素开始,逐个向后比较,直到找到目标元素或遍历完整个数据集合为止。顺序查找的基本思想是从数组的第一个元素开始,逐个与目标值进行比较,如果相等则返回当前位置;如果不相等且没有到达数组末尾,则继续向后比较下一个元素。重复这个过程,直到找到目标元素或者遍历完整个数组。