顺序查找

合集下载

查找排序

查找排序
Low指向待查元素 所在区间的下界 mid指向待查元素所在 区间的中间位臵 high指向待查元素所 在区间的上界
解:① 先设定3个辅助标志: low,high,mid, 显然有:mid= (low+high)/2 ② 运算步骤:
(1) low =1,high =11 ,故mid =6 ,待查范围是 [1,11]; (2) 若 S[mid] < key,说明 key[ mid+1,high] , 则令:low =mid+1;重算 mid= (low+high)/2;. (3) 若 S[mid] > key,说明key[low ,mid-1], 则令:high =mid–1;重算 mid ; (4)若 S[ mid ] = key,说明查找成功,元素序号=mid; 结束条件: (1)查找成功 : S[mid] = key (2)查找不成功 : high<low (意即区间长度小于0)
while(low<=high)
{ mid=(low+high)/2; if(ST[mid].key= = key) return (mid); /*查找成功*/
else if( key< ST[mid].key) high=mid-1; /*在前半区间继续查找*/ else } return (0); /*查找不成功*/
4 5 6 7
0
1
2
90
10
(c)
20
40
K=90
80
30
60
Hale Waihona Puke 25(return i=0 )
6
讨论:怎样衡量查找效率?
——用平均查找长度(ASL)衡量。
如何计算ASL?

顺序查找法适用于存储结构为顺序或链接存储的线行表

顺序查找法适用于存储结构为顺序或链接存储的线行表

一判断题1.顺序查找法适用于存储结构为顺序或链接存储的线行表。

2.一个广义表可以为其他广义表所共享。

3.快速排序是选择排序的算法。

4.完全二叉树的某结点若无左子树,则它必是叶子结点。

5.最小代价生成树是唯一的。

6.哈希表的结点中只包含数据元素自身的信息,不包含任何指针。

7.存放在磁盘,磁带上的文件,即可意识顺序文件,也可以是索引文件。

8.折半查找法的查找速度一定比顺序查找法快。

二选择题1.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。

A. nB. 2n-1C. 2nD. n-12.在文件"局部有序"或文件长度较小的情况下,最佳内部排序的方法是()。

A. 直接插入排序B.气泡排序C. 简单选择排序D. 快速排序3.高度为K的二叉树最的结点数为()。

A. 24.一个栈的输入序列是12345,则占的不可能的输出序列是()A.54321B. 45321C.43512D.123455.ISAM文件和V ASM文件属于()A索引非顺序文件 B. 索引顺序文件 C. 顺序文件 D. 散列文件6. 任何一棵二叉树的叶子结点在先序,中序和后序遍历序列中的相对次序()A. 不发生变化B. 发生变化C. 不能确定D. 以上都不对7.已知某二叉树的后序遍历序列是dabec, 中序遍历序列是debac , 它的前序遍历是()。

A. acbedB. decabC. deabcD.cedba三.填空题1.将下图二叉树按中序线索化,结点的右指针指向(),Y的左指针指向()B DC X EY2.一棵树T中,包括一个度为1的结点,两个度为2的结点,三个度为3的结点,四各度为4的结点和若干叶子结点,则T的叶结点数为()3.抽象数据类型的定义仅取决与它的一组(),而与()无关,即不论其内部结构如何变化,只要它的()不变,都不影响其外部使用。

4.VSAM(虚拟存储存取方法)文件的优点是:动态地(),不需要文件进行(),并能较快的()进行查找。

顺序表的查找c语言代码

顺序表的查找c语言代码

顺序表的查找c语言代码
顺序表是一种线性表,它的元素在物理上是连续存储的。

在顺序表中,每个元素都有一个唯一的下标,也称为索引,可以通过索引来访问顺序表中的元素。

顺序表的查找是指在顺序表中查找某个元素是否存在,并返回其位置或者不存在的信息。

顺序表的查找可以分为两种:顺序查找和二分查找。

顺序查找是从顺序表的第一个元素开始,逐个比较,直到找到目标元素或者遍历完整个顺序表。

二分查找是在有序的顺序表中进行的,每次将查找区间缩小一半,直到找到目标元素或者查找区间为空。

下面是顺序查找的C语言代码:
```c
int sequential_search(int *a, int n, int key)
{
int i;
for (i = 0; i < n; i++)
{
if (a[i] == key)
{
return i;
}
}
return -1;
}
```
这个函数接受三个参数:一个整型数组a,数组的长度n,和要查找的元素key。

函数返回key在数组a中的位置,如果不存在则返回-1。

顺序查找的时间复杂度是O(n),其中n是顺序表的长度。

在最坏情况下,需要遍历整个顺序表才能找到目标元素,因此顺序查找的效率不高。

如果顺序表是有序的,可以使用二分查找来提高查找效率。

顺序表的查找是数据结构中的基本操作之一,也是算法设计中的重要内容。

在实际应用中,我们需要根据具体的情况选择合适的查找算法,以提高程序的效率。

数据结构——查找,顺序查找,折半查找

数据结构——查找,顺序查找,折半查找

实验五查找的应用一、实验目的:1、掌握各种查找方法及适用场合,并能在解决实际问题时灵活应用。

2、增强上机编程调试能力。

二、问题描述1.分别利用顺序查找和折半查找方法完成查找。

有序表(3,4,5,7,24,30,42,54,63,72,87,95)输入示例:请输入查找元素:52输出示例:顺序查找:第一次比较元素95第二次比较元素87 ……..查找成功,i=**/查找失败折半查找:第一次比较元素30第二次比较元素63 …..2.利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查询。

输入输出示例同题1的要求。

三、数据结构设计(选用的数据逻辑结构和存储结构实现形式说明)(1)逻辑结构设计顺序查找和折半查找采用线性表的结构,二叉排序树的查找则是建立一棵二叉树,采用的非线性逻辑结构。

(2)存储结构设计采用顺序存储的结构,开辟一块空间用于存放元素。

(3)存储结构形式说明分别建立查找关键字,顺序表数据和二叉树数据的结构体进行存储数据四、算法设计(1)算法列表(说明各个函数的名称,作用,完成什么操作)序号 名称 函数表示符 操作说明1 顺序查找 Search_Seq 在顺序表中顺序查找关键字的数据元素2 折半查找 Search_Bin 在顺序表中折半查找关键字的数据元素3 初始化 Init 对顺序表进行初始化,并输入元素4 树初始化 CreateBST 创建一棵二叉排序树5 插入 InsertBST 将输入元素插入到二叉排序树中6 查找 SearchBST在根指针所指二叉排序树中递归查找关键字数据元素 (2)各函数间调用关系(画出函数之间调用关系)typedef struct { ElemType *R; int length;}SSTable;typedef struct BSTNode{Elem data; //结点数据域 BSTNode *lchild,*rchild; //左右孩子指针}BSTNode,*BSTree; typedef struct Elem{ int key; }Elem;typedef struct {int key;//关键字域}ElemType;(3)算法描述int Search_Seq(SSTable ST, int key){//在顺序表ST中顺序查找其关键字等于key的数据元素。

1.9编程基础之顺序查找(15题)

1.9编程基础之顺序查找(15题)

01:查找特定的值••提交•统计•提问总时间限制:1000ms存限制:65536kB描述在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。

输入第一行包含一个正整数n,表示序列中元素个数。

1 <= n <= 10000。

第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。

元素的绝对值不超过10000。

第三行包含一个整数x,为需要查找的特定值。

x的绝对值不超过10000。

输出若序列中存在x,输出x第一次出现的下标;否则输出-1。

02:输出最高分数的学生•描述输入学生的人数,然后再输入每位学生的分数和,求获得最高分数的学生的。

输入第一行输入一个正整数N(N <= 100),表示学生人数。

接着输入N行,每行格式如下:分数分数是一个非负整数,且小于等于100;为一个连续的字符串,中间没有空格,长度不超过20。

数据保证最高分只有一位同学。

输出获得最高分数同学的。

来源习题(13-1)03:不高兴的津津描述津津上初中了。

妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。

另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。

但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。

假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。

请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入包括七行数据,分别表示周一到周日的日程安排。

每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出包括一行,这一行只包含一个数字。

如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。

如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

04:谁拿了最多奖学金•提交•统计•提问总时间限制:1000ms存限制:65536kB描述某校的惯例是在每学期的期末考试之后发放奖学金。

对n个元素的表做顺序查找时,若查找每个元素

对n个元素的表做顺序查找时,若查找每个元素

对n个元素的表做顺序查找时,若查找每
个元素
顺序表查找又称线性查找,是指从表中第一个元素开始,逐步和给定的关键字进行比较,如果顺序表中某个元素和给定的关键字相等,则表示查找成功,否则就表示查找失败顺序表中的元素越多,它的效率就越低。

因此,它只适合表中元素比较少的顺序表,如果表中的元素非常多,我们必须另想办法最糟糕的情况应该是比较到线性表最后一个值,也没有查找到所需要的值,那么从线性表的第0个值开始比较,每次取出一个值比较,不符合,再取下一个值,依次比较,一直到最后一个,那么长度为N,就需要比较N次。

从一个具有n个节点的单
链表中查找其值等于x的节点,在查找成功的情况下,平均需要比较(n+1)/2个节点。

由于单链表只能进行单向顺序查找,以从第一个节点开始查找为例,查找第m个节点需要比较的节点数f(m)=m,查找
成功的最好情况是第一次就查找成功,只用比较1个节点,最坏情况则是最后才查找成功,需要比较n个节点。

所以一共有n种情况,平均下来需要比较的节点为
(1+2+3+...+(n-1)+n)/n=(n+1)/
2。

数据结构-7顺序查找与二分查找

数据结构-7顺序查找与二分查找

i=m+1=8,j=8, m=(i+j)/2=8。 r[m]>k : 在左半部分继续查找。
i=8, j=m-1=7 ,
i>j: 查找失败
存储结构
key info 0 1 k1 2 k2 3 k3
…………
n kn
typedef struct { keytype key; ………….
} elemtype;
分块有序表的结构可以分为两部分: 1、线性表本身是顺序存储结构 2、再建立一个索引表,线性表中每个子表建立一个索引节点
。索引节点包括两部分:一是数据域,一是指针域。数据域存 放对应子表中的最大元素值,指针域用于指示子表第一个元素 的在整个表中序号。
分块查找
template<class T> struct indnode {
key=32
d (1) 27
i=1
d (2) 36
i=2
d (3) 32i=3 Nhomakorabead (4) 18
此时d(i)=key,数组中的第3个位置
如果输入查找的元素值key=22
d (1) 27 i=1
d (2) 36 i=2
d (3) 32 i=3
d (4) 18
i=4 i=5 此时i等于5,超过数组中元素个数,找不到
T key; int k; };
上图查找过程:首先查找索引表,确定查找的子表,然后再相应的子表中 应顺序表查找法查找。
• int blksearch(record r[],index idx[],keytype key)
•{
• int i=0,j;
• while(i<idxN)
•{
• if(key<=idx[i].key){

【C++】顺序查找与折半查找(附带解说)

【C++】顺序查找与折半查找(附带解说)
else if(x<a[mid]) up=mid-1; //如果所比较的元素比查找的小,则从元素值比较低的一方中查找
else low=mid+1; //如果所比较的元素比查找的大,则从元素值比较高的一方中查找
}
return -1; //未找到则输出-1
1、顺序查找
#include <iostream.h>
#define M 10
int search(int a[],int x,int n) //定义【查找函数】 定义形参为实型数组a[](被查找的数组) ,实型数x(需要查找的数) ,实型数n(数组内元素的个数)
cin>>x;
p=search(array,x,M); //调用【查找函数】,同时接受返回值
cout<< "原始数组:" <<endl;
for(i=0;i<M;i++)
cout<< a[i] <<"\t";
if(p>=0) cout<< "查找成功!该数的下标为:" << p <<endl;
p=bi_search(array,x,M);
cout<< "原始数组为:" <<endl;
for(i=0;i<M;i++)
cout<< array[i] <<"\t";
if(p>=0) cout<< "查找成功!数组元素下标为:" << p <<endl;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
void main()
{
SSTable st;
int i,s;
for(i=0;i<N;i++) /*计算总分*/
r[i].total=r[i].politics+r[i].Chinese+r[i].English+r[i].math+r[i].physics+r[i].chemistry+r[i].biology;
顺序查找
#include<stdio.h>
#define MAXL 10
typedef int KeyType;
typedef struct
{
KeyType key;
}NodeType;
typedef NodeType SeqList[MAXL];
int SeqSearch(SeqList R,int n,KeyType k)
{ /*操作结果:构造一个含n个数据元素的静态按关键字非降序查找表ST */
/*数据来自全局数组r */
Status f;
f=Creat_Seq(ST,n);
if(f)
Ascend(ST);
return f;
}
Status Destroy(SSTable *ST)
{ /*初始条件:静态查找表ST存在。操作结果:销毁表ST */
/*该元素在表中的位置,否则为0。*/
int low,high,mid;
low=1; /*置区间初值*/
high=ST.length;
while(low<=high)
{
mid=(low+high)/2;
if EQ(key,ST.elem[mid].key) /*找到待查元素*/
return mid;
if(i)
print(*(st.elem+i));
else
printf("没找到\n");
Destroy(&st);
}
{
k=j;
(*ST).elem[0]=(*ST).elem[j];
}
if(k!=i) /*有更小的值则交换*/
{
(*ST).elem[k]=(*ST).elem[i];
(*ST).elem[i]=(*ST).elem[0];
}
}
}
Status Creat_Ord(SSTable *ST,int n)
#define N 5 /*数据元素个数*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int KeyType; /*设关键字域为整型*/
{ /*初始条件:静态查找表ST存在,Visit()是对元素操作的应用函数*/
/*操作结果:按顺序对ST的每个元素调用函数Visit()一次且仅一次。*/
/*一旦Visit()失败,则操作失败*/
ElemType *p;
int i;
p=++ST.elem; /* p指向第一个元素*/
for(i=1;i<=ST.length;i++)
{179325,"陈红",85,86,88,100,92,90,45},
{179326,"陆华",78,75,90,80,95,88,37},
{179327,"张平",82,80,78,98,84,96,40},
{179328,"赵小怡",76,85,94,57,77,69,44}}; /*全局变量*/
printf("\n元素%d的位置是%d\n",k,i+1);
else
printf("k不存在\n");

顺序查找方法二:
#include<limits.h> /* INT_MAX等*/
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#define OK 1
#define ERROR 0
free((*ST).elem);
(*ST).elem=NULL;
(*ST).length=0;
return OK;
}
int Search_Seq(SSTable ST,KeyType key)
{ /*在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为*/
/*该元素在表中的位置,否则为0。*/
Visit(*p++);
return OK;
}
void print(ElemType c) /* Traverse()调用的函数*/
{ printf("%-8ld%-8s%4d%5d%5d%5d%5d%5d%5d%5d\n",c.number,,c.politics,c.Chinese,c.English,c.math,c.physics,c.chemistry,c.biology,c.total);
int a[10],i;
printf("输入数字:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
R[i].key=a[i];
printf("\n");
printf("输入k:");
scanf("%2d",&k);
if((i=SeqSearch(R,n,k))!=-1)
if(!(*ST).elem)
return ERROR;
for(i=1;i<=n;i++)
*((*ST).elem+i)=r[i-1]; /*将全局数组r的值依次赋给ST */
(*ST).length=n;
return OK;
}
void Ascend(SSTable *ST)
{ /*重建静态查找表为按关键字非降序排序*/
#define total key /*定义总分(total)为关键字*/
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef struct
{
ElemType *elem; /*数据元素存储空间基址,建表时按实际长度分配,0号单元留空*/
int i;
ST.elem[0].key=key; /*哨兵*/
for(i=ST.length;!EQ(ST.elem[i].key,key);--i); /*从后往前找*/
return i; /*找不到时,i为0 */
}
int Search_Bin(SSTable ST,KeyType key)
{ /*在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为*/
Creat_Seq(&st,N); /*由全局数组产生静态查找表st */
printf("准考证号姓名政治语文外语数学物理化学生物总分\n");
Traverse(st,print); /*按顺序输出静态查找表st */
printf("请输入待查找人的总分: ");
scanf("%d",&s);
i=Search_Seq(st,s); /*顺序查找*/
int length; /*表长度*/
}SSTable;
Status Creat_Seq(SSTable *ST,int n)
{ /*操作结果:构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r) */
int i;
(*ST).elem=(ElemType *)calloc(n+1,sizeof(ElemType)); /*动态生成n个数据元素空间(0号单元不用) */
int math; /*数学*/
int physics; /*物理*/
int chemistry; /*化学*/
int biology; /*生物*/
KeyType key; /*关键字类型应为KeyType,域名应为key,与bo9-1.c中一致*/
} ElemType;
ElemType r[N]={{179324,"何芳芳",85,89,98,100,93,80,47},
{
int i=0;
while(i<n&&R[i].key!=k)
{
printf("%-3d",R[i].key);
i++;
}
if(i>=n)
return -1;
else
{
printf("%d",R[i].key);
return i;
}
}
void main(){
SeqList R;
int n=10;
KeyType k;
typedef struct /*数据元素类型(以教科书图9.1高考成绩为例) */
{
long number; /*准考证号*/
char name[9]; /*姓名(4个汉字加1个串结束标志) */
int politics; /*政治*/
相关文档
最新文档