第8章 数组
(完整word版)数据结构 第八章排序

第八章排序:习题习题一、选择题1.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序2.设有1000个无序的记录,希望用最快的速度挑选出其中前10个最大的记录,最好选用( )排序法。
A.冒泡排序B.快速排序C.堆排序D.基数排序3.在待排序的记录序列基本有序的前提下,效率最高的排序方法是( )。
A.插入排序B.选择排序C.快速排序D.归并排序’4.不稳定的排序方法是指在排序中,关键字值相等的不同记录的前后相对位置( )。
A.保持不变B.保持相反C.不定D.无关5.内部排序是指在排序的整个过程中,全部数据都在计算机的( )中完成的排序。
A. 内存储器B.外存储器C.内存储器和外存储器D.寄存器6.用冒泡排序的方法对n个数据进行排序,第一趟共比较( )对记录。
A.1B.2C.n-lD.n7.直接插入排序的方法是从第( )个记录开始,插入前边适当位置的排序方法。
A.1B.2C.3D.n8.用堆排序的方法对n个数据进行排序,首先将n个记录分成( )组。
A.1B.2C.n-lD.n9.归并排序的方法对n个数据进行排序,首先将n个记录分成( )组,两两归并。
A.1B.2C.n-lD.n10.直接插入排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树11.冒泡排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树12.快速排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树13.排序方法中,从未排序序列中依次取出记录与已排序序列(初始时为空)中的记录进行比较,将其放入已排序序列的正确位置上的方法,称为( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序14.每次把待排序的记录划分为左、右两个子序列,其中左序列中记录的关键字均小于等于基准记录的关键字,右序列中记录的关键字均大于基准记录的关键字,则此排序方法叫做( )。
第八章 数组

例: int a[2][3]; 它在内存情况:
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
8.2 二维数组的引用与初始化
一、引用形式:数组名[下标][下标]
(1)下标可以是整型表达式或符号常量 例如:a[2][3],a[2-1][2*2-1]
(2)数组元素可以出现在表达式中,也可以被赋值。
例如: 有定义 int a[10]; 数组元素引用举例 /*可以引用元素的从a[0]到a[9]*/
a[5]=6; a[7]=a[5]++;
a[6]=3; a[0]=a[5]+a[7]-a[2*3];
8.1.3 一维数组的初始化
1.初始化--在定义数组时对数组元素赋初值; 2.初始化方法:
[static] 数组类型 数组名[数组长度]={数组元素值};
运行结果: I am happy
例8-stdio.h>
void main( )
{
char c[5][5]={{‘ ‘,’ ‘,’* ‘},{‘ ‘,’*’,’ ‘,’*’},{‘*’,’ ‘,’ ‘,’ ‘,’*’}, {‘ ‘,’*’,’ ‘,’*’},{‘ ‘,’ ‘,’*’}};
举例:
(1)给数组a各元素赋以初值: [static] int a[10]={0,1,2,3,4,5,6,7,8,9}; (2)可以只给一部分元素赋初值,后几个元素值为 0 [static] int a[10]={0,1,2,3,4}; (3)如果想使一个数组中全部元素值为0,可以写成: static int a[10]={0,0,0,0,0,0,0,0,0,0} 或static int a[10]; (4)在全部数组元素赋初值时,可以不指定数组长度: int a[5]={1,2,3,4,5}; 可以写成: int a[ ]={1,2,3,4,5};
高中信息技术 信息学奥赛C语言第八章 数组课件

int a[5]={0,1,2,3,4}; 也可以省略为:
int a[ ]={0,1,2,3,4};
说明:
1.可以只给部分数组元素赋初值。当{}中 值的个数少于数组元素个数时,则表示初 值只赋于数组开始的若干个元素,余下部 分元素为相应类型的缺省值,int为整型数0, 字符型为空格等。
二维数组存储结构是“按行存放,先行后列”,
说明:
(1)数组名是用户定义标识符
(2)数组名后面的两对方括号必不可少, 之间不能有空格。方括号中必须是常量表 达式,表达式1表示数组的行数,表达式2 表示数组的列数。其中必须是正的整型常 量,绝对不能是变量。
(3)定义后,a数组在内存中占用6个连续 的存储单元,按照行的顺序依次存储各个 元素。 见书p75图8-2、图8-3.
8.数组定义中,数组长度除多数情况下作显式说明 外,有两种情况下不必或不能用长度说明,而用[] 代替。
(1)给数组全体元素赋初值时,可省去数组长度说 明。
(2)数组名作为函数的参数,在函数的参数说明部 分,当指出参数是数组时,不能用长度说明。
二、一维数组的初始化
• 当系统为所定义的数组在内存中开辟一串连续的 存储单元时,这些存储单元中并没有确定的值,数 组的初始化就是指在定义数组时给数组元素赋初值。
为一维数组。 • 一维数组的定义方式为:
类型名 数组名[常量表达式]; 例如: int array[10];
它表示定义了一个名为array的数组, 此数组有10个元素,每个元素的数据类型 为整型。
一维数组定义的说明:
第8章习题参考答案

第8章习题参考答案1. 如果认为CPU等待设备的状态信号是处于非工作状态(即踏步等待),那么在下面几种主机与设备之间的数据传送中:A主机与设备是串行工作的;B 主机与设备是并行工作的,C 主程序与设备是并行运行的。
A .程序查询方式B .程序中断方式C . DMA方式2. 中断向量地址是B。
A•子程序入口地址 B •中断服务程序入口地址C•中断服务程序入口地址指示器 D •例行程序入口地址3•利用微型机制作了对输入数据进行采样处理的系统。
在该系统中,每抽取一个输入数据就要中断CPU 一次,中断处理程序接收采样的数据,将其放到主存的缓冲区内。
该中断处理需时x秒,另一方面缓冲区内每存储n个数据,主程序就将其取出进行处理,这种处理需时y秒。
因此该系统可以跟踪到每秒 A 次的中断请求。
A . n/ (n 次 + y)B . n/(x + y) n C. min(1 /x, n/y)4•采用DMA方式传送数据时,每传送一个数据就要占用一个 C 的时间。
A .指令周期B .机器周期C.存储周期 D .总线周期5. 通道的功能是:⑴ 控制外围设备,⑵ 组织外围设备和内存之间进行数据传输______ 。
按通道的工作方式分,通道有选择通道、数组多路通道和字节多路通道三种类型。
6. 在图8.9中,当CPU对设备B的中断请求进行服务时,如设备A提出请求,CPU能够响应吗?为什么?如果设备B 一提出请求总能立即得到服务,问怎样调整才能满足此要求?答:不能,因为A、B是同级别的中断。
要使设备B一提出请求总能立即得到服务,除非将B提高到上一级,并令IM3=0,即构成一个3级IR。
7. 在图& 9中,假定CPU取指并执行一条指令的时间为t1,保护现场需t2,恢复现场需t3,中断周期需t4,每个设备的设备服务时间为t A , t B,…,t G。
试计算只有设备A , D, G时的系统中断饱和时间。
答:依次处理设备A,设备D,设备G的时间为:T1 = t1+t2+t3+t4+t AT2 = t1+t2+t3+t4+t DT3 = t1+t2+t3+t4+t G总时间为T = T1+T2+T 3 = 3*( t 1+t2+t3+t4)+ t A + t D + t G&设某机有5级中断;L o, L1, L2, L3, L4,其中断响应优先次序为:L o最高,L1次之,L4最低。
第8章_查找

{
int low,mid,high;
low=0;
/*确定起始区间低下界位置*/
high=n-1;
/*确定起始区间高下界位置*/
while(low<=high)
{
mid=(low+high)/2;
/*求区间范围的中间位置*/
if(a[mid].key==k) return mid;
/*比较中间位置上的关键字与给定值*/ /*查找成功,返回查找到的记录的下标*/
精选2021版课件
6
8.2.2 折半查找
一、折半查找 又称为二分查找。使用该查找算法的前提条件是:查找表
中记录顺序存储且相应的关键字值有序。
例8-1 设顺序表中有8个记录,它们的关键字依次为{8,11,18,28, 45,55,63,80},用折半查找的方法在该顺序表中查找关键字为55 和20的记录。查找关键字为55的记录的过程见图:
8.2.3 分块查找
一、分块查找
分块查找(又称为索引顺序查找),是顺序查找的一种改进方法。
在分块查找时,把表内的记录按某种属性分成n(n>1)个块(子表),且 块间有序,块内无序。然后建立一个相应的“索引表”,索引表由若 干个索引记录组成,每个索引记录对应一个块。索引记录包含两个数 据项,即对应块内最大关键字值和块中第一个记录位置的地址指针。
个关键字能确定多个记录,称该关键字为次关键字。 查找(Searching):给定一个确定的值,在查找表中确定
一个记录,其相应的关键字等于给定值的操作。
精选2021版课件
2
根据对查找表进行的不同操作,把查找表分为静态 查找表和动态查找表两种。
• 静态查找表是指只查询给定的记录是否存在于查找 表中或检索某个特定记录的有关属性。
C语言程序设计ppt数组

达数组中打头元素旳地址
2024/10/10
6
8.2.1 一维数组旳申明
例8.1 具有基本数据类型旳一维数组旳申明
#define SIZE 10 int array[5]; double d[5],e[SIZE]; char name[SIZE*5];
13. double even;
21. course_even[i]=course_su
/*分别为全部课程旳总分、平均分 m[i]/5.0;
*/
22. sum+=course_sum[i];
14. int i;
23.
} /* 计算各门课平总分 */
24. even=sum/(3.0*SIZE);
2024/10/10
2024/10/10
17
例8.10
8. int course_sum[3]={0,0,0}; 15. for(i=0;i<5;i++){
9. double course_even[3];
16. course_sum[0]+=math[i];
/组**分/ 别为各门课程总分、平均分数17. course_sum[1]+=physics[i];
用若干个数字序号(下标)来区别各数组元素
例如定义float score[30],可表述30位学生成绩 用数组具有什么好处?
2024/10/10
3
8.1 数组概述
问题
计算全班30位同学某门课程旳平均成绩
处理措施
设置30个float型变量来统计成绩 设置一种有30个float型元素旳数组来统计成绩
第8章 数组和广义表

第8章数组和广义表[能力要求](1)计算机基础知识:掌握线性表的概念以及顺序表和链表的基本操作。
(2)分析问题:针对具体的问题,要能够运用线性表去进行分析,逐步找到解决问题的方法。
(3)具有概念化和抽象化能力:针对具体的应用和实际的问题,能够运用线性表对问题进行抽象,提取它的逻辑结构和存储结构。
(4)发现问题和表述问题:在具体的工程中,能够发现工程中涉及到顺序表和链表的问题,并能够明确表述。
(5)建模:在具体的工程中,能够使用线性表进行建模,设计合理的数据结构和相应的算法。
(6)解决方法和建议:在具体工程应用中,发现了关于线性表的问题,要能够解决问题,并提出合理的建议。
(7)定义功能、概念和结构:使用线性表这种逻辑结构处理一些具体问题,实现系统的功能。
(8)设计过程的分段与方法:采取不同的阶段去设计(概念设计、详细设计)一个具体的线性表的应用项目。
(9)软件实现过程:了解系统中各个模块中的关于线性表的设计;讨论算法(数据结构、控制流程、数据流程);使用编程语言实施底层设计(编程)。
8.1知识点:数组的定义和顺序存储一、选择题1①常对数组进行的两种基本操作是()。
A.建立与删除 B.索引和修改C.对数据元素的存取和修改D.查找与索引2①下面说法中,不正确的是()。
A.数组是一种线性结构B.数组是一种定长的线性表结构C.除了插入与删除操作外,数组的基本操作还有存取、修改、检索和排序等D.数组的基本操作有存取、修改、检索和排序等,没有插入与删除操作3②数组A中,每个元素的长度为3个字节,行下标I从1到8,列下标J从1到10,从首地址SA开始连续存放在存储器内,该数组占用的字节数为()。
A.80 B.100 C.240 D.2704②在二维数组A[9][10]中,每一个数组元素A[i][j] 占用3个存储空间,所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储空间是()。
A. 80 B.100 C.240 D.2705②设有一个n*n的对称矩阵A,将其下三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第I行的对角元素A[I][I]存放于B中()处。
数据结构教程李春葆课后答案第8章图

3
3
3
3 5 3
图 8.10 图 G
图 8.11 图 G 中的关键路径
14. 假设不带权有向图采用邻接矩阵 g 存储,设计实现以下功能的算法: (1)求出图中每个顶点的入度。 (2)求出图中每个顶点的出度。 (3)求出图中出度为0的顶点数。 解:利用邻接矩阵的特点和相关概念得到如下算法:
????????????????????????????????????????????0303034050640a图89邻接矩阵a10234545643331023454564333图810图g图811图g中的关键路径14
第8章 图
教材中练习题及参考答案
1. 图G是一个非连通图,共有28条边,则该图至少有多少个顶点? 答:由于G是一个非连通图,在边数固定时,顶点数最少的情况是该图由两个连通分 量构成,且其中之一只含一个顶点(没有边),另一个为完全无向图。设该完全无向图的 顶点数为n, 其边数为n(n-1)/2,即n(n-1)/2=28,得n=8。所以,这样的非连通图至少有1+8=9 个顶点。 2. 有一个如图 8.2(a)所示的有向图,给出其所有的强连通分量。 答:图中顶点0、1、2构成一个环,这个环一定是某个强连通分量的一部分。再考察顶 点3、4,它们到这个环中的顶点都有双向路径,所以将顶点3、4加入。考察顶点5、6,它 们各自构成一个强连通分量。该有向图的强连通分量有3个,如图8.2(b)所示。
2
数据结构教程学习指导
接表表示的有向图,图中的边数等于边结点的个数。 (2)对于邻接矩阵g表示的无向图,邻接矩阵数组元素g.edges[i][j]为1表示它们有边相 连,否则为无边相连。对于邻接矩阵g表示的有向图,邻接矩阵数组元素g.edges[i][j]为1表 示从顶点i到顶点j有边,g.edges[j][i]为1表示从顶点j到顶点i有边。 对于邻接表G表示的无向图,若从头结点G->adjlist[i]的单链表中找到编号为j的边表结 点,表示它们有边相连;否则为无边相连。对于邻接表 G 表示的有向图,若从头结点 G->adjlist[i] 的单链表中找到编号为 j的边表结点,表示从顶点 i到顶点 j有边。若从头结点 G->adjlist[j]的单链表中找到编号为i的边表结点,表示从顶点j到顶点i有边。 (3)对于邻接矩阵表示的无向图,顶点i的度等于第i行中元素为1的个数;对于邻接矩 阵表示的有向图,顶点i的出度等于第i行中元素为1的个数,入度等于第i列中元素为1的个 数,顶点i度等于它们之和。 对于邻接表G表示的无向图,顶点i的度等于G->adjlist[i]为头结点的单链表中边表结点 个数。 对于邻接表G表示的有向图,顶点i的出度等于G->adjlist[i]为头结点的单链表中边表结 点的个数;入度需要遍历所有的边结点,若G->adjlist[j]为头结点的单链表中存在编号为 i 的边结点,则顶点i的入度增1,顶点i的度等于入度和出度之和。 5. 对于如图 8.3 所示的一个无向图 G,给出以顶点 0 作为初始点的所有的深度优先遍 历序列和广度优先遍历序列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C.int m[10]=(0,0,0,0) ;
D.int m[10]={10*2};
0805.若有定义:intbb[8];
则以下表达式中不能代表数组元bb[1]的地址的是( )。
A.&bb[0]++
B.&bb[1]
C.&bb[0]+1
D.bb+1
0806.在VC++6.0中,假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是( )。
B.一维数组的元素在引用时其下标大小没有限制
C.任何一个一维数组的元素,可以根据内存的情况按照其先后顺序以连续或非连续的方式占用存储空间
D.一维数组的第一个元素是其下标为1的元素
0819.不能把字符串:Hello!赋给数组b的语句是( )。
A.char str[10];str="Hello!";
B.char str[10]={'H','e','l','l','o','!'};
for(k=0;k<4;k++)
if(a1[i]<a2[j]) a[k]=a1[i++];
elsea[k]=a2[j++];
for(k=0;k<4;k++) printf("%d",a[k]);
}
输出结果:1234
0839.main()
{
int i,k,a[10],p[3];
k=5;
for (i=0;i<10;i++) a[i]=i;
0821.下列语句中,不正确的是( )。
A.static char a[2]={ '1', '2', '3'};
B.static char a[2]={ '1', '2'};
C.static char a[2]={1,2};
D. static char a[2]={ '1'};
0822.若给出以下定义:
gets(ss);printf("%s\n",ss);
}
A.ABC
B.ABC9
C.123456ABC
D.ABC456789
0829.下列程序的主要功能是输入10个整数存入数组a,再输入一个整数x,在数组a中查找x。找到则输出x在10个整数中的序号(从1开始);找不到则输出0。程序缺少的是( )。
main()
C.x-a[i]
D.!x-a[i]
0830.若有以下数组定义,其中正确的是( )。
A.inta[2][3];
B.intb[1][3]={0,1,2,3};
C.intc[][]={0};
D.intd[3][3]={{1,2},{1,2,3},{1,2,3,4}};
0831.若有以下的定义:intt[5][4];不能正确引用t数组的表达式是( )。
do
{a[i]=y%2; i++;
y=y/2;
} while(y>=1);
for(j=i-1;j>=0;j--) printf("%d",a[j]);
printf("\n");
}
输出结果:10010
0838.main()
{
int a[10], a1[ ]={1,3,6,9,10}, a2[ ]={2,4,7,8,15},i=0,j=0,k;
C. n[2][5]
D. n[1][4]
0834.若二维数组c有m列,则计算任一元素c[j][k]在数组中的位置的公式为( )。(假设c[0][0]位于数组的第一个位置)
A. j*m+k+1
B. k*m+j
C. j*m+k-1
D. j*m+k
读程序题
0835.main()
{
int i,a[10];
for(i=9;i>=0;i--) a[i]=10-i;
A.intd[3][]={{1,2},{1,2,3},{1,2,3,4}};
B.intb[][3]={0,1,2,3};
C.intc[100][100]={0};
D.inta[2][3];
0811.若有以下的定义:int t[5][4];能正确引用t数组的表达式是( )。
A.t[0][0]
B. t[5][0]
}
输出结果:0650
0842.main()
{
int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};
int i,s=0;
for(i=0;i<4;i++) s+=aa[i][1];
printf(“%d\n”,s);
}
输出结果:19
0843.main()
}
A. 1,23,456
B. 1,456,789
C. 1,23,456,789
D. 123,456,789
0828.运行下面的程序,如果从键盘上输入:ABC时,输出的结果是( )。
#include<string.h>
main()
{
char ss[10]="12345";
strcat(ss, "6789");
D.3 6 9
0817.下述对C语言字符数组的描述中错误的是( )。
A.可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
B.字符数组中的字符串可以整体输入、输出
C.字符数组可以存放字符串
D.不可以用关系运算符对字符数组中的字符串进行比较
0818.下述对C语言字符数组的描述中正确的是( )。
A.任何一维数组的名称都是该数组存储单元的开始地址,且其每个元素按照顺序连续占存储空间
{
int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;
for(i=1;i<3;i++)
for(j=0;j<=i;j++)s+=a[i][j];
printf("%d\n",s);
}
输出结果:18
0844.main()
{
char ch[7]={ "65ab21"};
inti,s=0;
char x[ ]="abcdefg";
char y[ ]={'a','b','c','d','e','f','g'};
则正确的叙述为( )。
A.数组x的长度大于数组y的长度
B.数组x和数组y的长度相同
C.数组x和数组y等价
D.数组x的长度小于数组y的长度
0823.若有数组定义:char array[ ]="China";则数组 array所占的空间为( )。
#include<stdio.h>
main()
{
int a[10],i=0;
while(i<10) scanf("%d",________ );
┇
}
A.a+(i++)
B.&a[i+1]
C.a+i
D.&a[++i]
0826.执行下面的程序段后,变量k中的值为( )。
int k=3, s[2];
s[0]=k; k=s[1]*10;
for (j=0;j<k;j++)
n[j]=n[i]+1;
printf("%d\n",n[1]); }
输出结果:3
0841.main()
{
int a[4][4]={{1,3,5},{2,4,6},{3,5,7}};
printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]);
A.40
B.30
C.20
D.10
0807.若有以下说明:
int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
char c='a',d,g;
则数值为4的表达式是( )。
A.a['d'-c]
B.a[4]
C.a['d'-'c']
g-c]
0808.若说明:int a[2][3];则对a数组元素的正确引用是( )。
C.t[2][4]
D. t[0,0]
0812.在定义int m[ ][3]={1,2,3,4,5,6};后,m[1][0]的值是( )。
A. 4
B. 1
C. 2
D. 5
0813.在定义intn[5][6]后第10个元素是( )。
A.n[1][3]
B. n[2][4]
C.n[2][5]
D. n[1][4]
A.6个字节
B.5个字节
C.4个字节
D.7个字节
0824.若有定义和语句:
char s[10];s="abcd";printf("%s\n",s);