1、C语言程序语言程序电子教案电子教案主要内容主要内容数组的基本概念数组的基本概念数组的定义和引用数组的定义和引用数组的基本操作数组的基本操作字符型数组字符型数组【例例5.15.1】设有两组数据设有两组数据(每组每组100100个个)已存入变量已存入变量a0,a1,a0,a1,a2,a99 a2,a99和和b0,b1,b2,b99b0,b1,b2,b99中。分别对应中。分别对应 求和。其结果存入求和。其结果存入c0,c1,c2,c0,c1,c2,,c99c99中。中。若用简单变量,则写成若用简单变量,则写成:c0=a0+b0;c0=a0+b0;c1=a1+b1;c1=a1+b1;c2=a2+b2;
2、c2=a2+b2;c99=a99+b99;c99=a99+b99;程序需要程序需要100100条赋值语句和定义条赋值语句和定义300300个变量。这样,个变量。这样,显得冗长、烦琐。若将每组数据作为一整体,用同一显得冗长、烦琐。若将每组数据作为一整体,用同一个符号名表示,同组内不同的数据依靠下标来区别,个符号名表示,同组内不同的数据依靠下标来区别,则只需一条语句,即:则只需一条语句,即:for(i=1;i100;i+)ci=ai+bi;for(i=1;i100;i+)ci=ai+bi;称称aiai、bibi、cici为数组元素,为数组元素,i i为下标。为下标。aiai是数组是数组a a中的第
3、中的第i i个元素;个元素;bi bi 是数组是数组b b中的第中的第i i个元个元素;素;cici是数组是数组c c中的第中的第i i个元素。个元素。a a、b b和和c c分别是数分别是数组的符号名,称为数组名。组的符号名,称为数组名。(1)(1)数组的名字。数组的名字。(2)(2)数组的类型。它表明了数组的基类型。数组的类型。它表明了数组的基类型。(3)(3)数组的结构。它指出数组的维数和数组元数组的结构。它指出数组的维数和数组元 素的个数。素的个数。(4)(4)数组的存储类别。它关系到数组所占存储数组的存储类别。它关系到数组所占存储 位置的作用域和生存期。位置的作用域和生存期。通常,数
4、组的四大要素由定义数组的说明语句通常,数组的四大要素由定义数组的说明语句来确定。来确定。例如例如:int array10;char b23;:int array10;char b23;static int a23;static int a23;5.2.1 5.2.1 一维数组的定义一维数组的定义 程序中使用数组时,应遵循先定义,后引用的程序中使用数组时,应遵循先定义,后引用的原则。原则。我们将具有一个下标的数组称为一维数组。定我们将具有一个下标的数组称为一维数组。定义一维数组的一般形式为:义一维数组的一般形式为:存储类型存储类型 类型说明符类型说明符 数组标识符数组标识符 常量表达式常量表达式
5、;例如:例如:int array10,number20;int array10,number20;static char ch15 static char ch15;存储类型存储类型:可以是自动型可以是自动型(auto)(auto),也可以是静态型,也可以是静态型 (static)(static)或者是外部型或者是外部型(extern)(extern);类型说明符类型说明符:用来说明数组的基类型,它可以是简单用来说明数组的基类型,它可以是简单 类型、指针类型或结构、联类型、指针类型或结构、联 合等构造类合等构造类 型,它说明了该数组元素所具有的类型;型,它说明了该数组元素所具有的类型;数组标识
6、符数组标识符:用来说明数组的名字;用来说明数组的名字;常量表达式常量表达式:用来说明数组元素的个数,即数组的长用来说明数组元素的个数,即数组的长 度,它可以是整常量、字符常量或度,它可以是整常量、字符常量或sizeof sizeof 表达式。表达式。(1)(1)数组标识符命令规则与变量相同,遵循标识符命名数组标识符命令规则与变量相同,遵循标识符命名 规则。规则。(2)(2)相同类型的数组可以放在同一说明行中,数组之间相同类型的数组可以放在同一说明行中,数组之间 用逗号分隔。用逗号分隔。(3)(3)数组名后是用方括号括起来的常量表达式,不能用数组名后是用方括号括起来的常量表达式,不能用 圆括号,
7、下面是错误的写法:圆括号,下面是错误的写法:float ary(20);float ary(20);(4)(4)常量表达式是数组所含元素的个数。编译系统在处常量表达式是数组所含元素的个数。编译系统在处 理说明语句时,为数组在内存中分配一片连续的存理说明语句时,为数组在内存中分配一片连续的存 储空间,数组元素将按其下标的顺序依次存放。储空间,数组元素将按其下标的顺序依次存放。(5)(5)数组名表示数组存储区别的首地址,即数组第一个数组名表示数组存储区别的首地址,即数组第一个 元素存放的地址。元素存放的地址。(6)(6)数组元素的下标值由数组元素的下标值由0 0开始,名为开始,名为arrayarr
8、ay的数组,由的数组,由 2020个元素组成,依照下标值的顺序,它们是:个元素组成,依照下标值的顺序,它们是:array0,array1,array2,array19 array0,array1,array2,array19 注意:不存在数组元素注意:不存在数组元素array20array20。(7)C(7)C语言中不允许出现动态数组说明,即数组的长度不语言中不允许出现动态数组说明,即数组的长度不 能依赖运行过程中变化着的变量。能依赖运行过程中变化着的变量。例如例如:下面数组下面数组arrayiarrayi的长度依赖于变量的长度依赖于变量i i的输入结的输入结 果,这是不允许的。果,这是不允许
9、的。int i;scanf(int i;scanf(%d%d,&i);,&i);char arrayi;char arrayi;(8)(8)当常量表达式缺少时,数组的长度由以下两当常量表达式缺少时,数组的长度由以下两 个因素决定:个因素决定:a.a.给出该数组每一元素的初值,从而确定该给出该数组每一元素的初值,从而确定该 数组长度。例如:数组长度。例如:static int a5=2,4,6,8,10;static int a5=2,4,6,8,10;与与 static int a=2,4,6,8,10;static int a=2,4,6,8,10;的描述等价。这表明,当数组长度由显的描述等
10、价。这表明,当数组长度由显式表示的初值个数直接决定时,数组长度不式表示的初值个数直接决定时,数组长度不必再以显式给出。必再以显式给出。int a10;int a10;main()main()int s10;int s10;char t10;char t10;.fun(a,s,t)fun(a,s,t)int a ,s;int a ,s;char t;char t;.数组与前面介绍的各种基本数据类型变数组与前面介绍的各种基本数据类型变量不同。量不同。数组具有存储类型、类型说明符、数组数组具有存储类型、类型说明符、数组标识符和常量表达式四方面的信息,且以标识符和常量表达式四方面的信息,且以它们来综合
11、描述。它们来综合描述。数组是一种在基本数据类型基础上构造数组是一种在基本数据类型基础上构造出的复杂数据类型。出的复杂数据类型。使数组元素得到值,可以有三种基本途径使数组元素得到值,可以有三种基本途径:(1)(1)用赋值语句;用赋值语句;(2)(2)用输入语句;用输入语句;(3)(3)初始化。初始化。前两种方式占运行时间,而初始化数组,可以使程序在运前两种方式占运行时间,而初始化数组,可以使程序在运行之前的编译阶段得到初值行之前的编译阶段得到初值 。数组的初始化数组的初始化:在定义数组时为数组元素赋初值。在定义数组时为数组元素赋初值。C C语言规定语言规定:只有静态存储只有静态存储(static
12、)(static)数组和外部存储数组和外部存储(extern)(extern)数组才可数组才可以进行初始化。以进行初始化。存储类型存储类型 类型说明符类型说明符 数组标识符数组标识符 常量表达式常量表达式=常量常量表达式表达式;说明:说明:“=常量表达式表常量表达式表”为赋初值部分;为赋初值部分;中各常量表达式是对应的数组元素初始,中各常量表达式是对应的数组元素初始,它们相互之间用逗号分隔。它们相互之间用逗号分隔。例如:例如:static int a4=0,1,2,3;static int a4=0,1,2,3;它等价于它等价于 static int a4;static int a4;a0=0
13、;a1=1;a2=2;a3=3;a0=0;a1=1;a2=2;a3=3;注:由于数组长度可由初值个数确定,故可以写成注:由于数组长度可由初值个数确定,故可以写成 static int a=0,1,2,3;static int a=0,1,2,3;(1)(1)当数组指明的元素个数大于初值个数时,则当数组指明的元素个数大于初值个数时,则 表明初值只赋给数组开始的若干元素,余下表明初值只赋给数组开始的若干元素,余下 部分为相应类型的缺省值,部分为相应类型的缺省值,intint为整型数为整型数0 0,字符型为空格。字符型为空格。例如:例如:static int a5=0,1,2,3;static in
14、t a5=0,1,2,3;表示表示 a0=0,a1=1,a2=2,a3=3,a4=0a0=0,a1=1,a2=2,a3=3,a4=0(2)(2)不允许数组指明的元素个数小于初值个数,不允许数组指明的元素个数小于初值个数,否则作语法出错处理。例如:否则作语法出错处理。例如:static int a6=0,1,2,3,4,5,6,7;static int a6=0,1,2,3,4,5,6,7;是错误的。是错误的。(3)(3)不允许对数组元素整体赋值,只能对每个数组元素不允许对数组元素整体赋值,只能对每个数组元素 赋初值。要使数组赋初值。要使数组a a中的全部元素初值为中的全部元素初值为0 0,则可
15、以,则可以写成:写成:static int a4=0,0,0,0;static int a4=0,0,0,0;而不能写成:而不能写成:static int a4=0static int a4=0*1010;其实,按上述其实,按上述(1)(1)的规定,对的规定,对staticstatic数组不赋初值,数组不赋初值,系统会自动对全部数组元素赋以系统会自动对全部数组元素赋以0 0值。值。即:即:static int a4static int a4;相当于相当于a0a0a3a3全部都赋以初值全部都赋以初值0 0。(4)(4)在对数组元素全部赋初值时,可以不指在对数组元素全部赋初值时,可以不指 定数组长
16、度,其长度由所赋初值的个数定数组长度,其长度由所赋初值的个数 自动确定自动确定 。如:。如:static int a=1,2,3,4static int a=1,2,3,4;a a数组的初值有数组的初值有4 4个,故系统自动确定个,故系统自动确定a a的长度为的长度为4 4。数组一经定义,其元素就可以被引用了。数组一经定义,其元素就可以被引用了。C C语言规定:语言规定:对数组的使用只有逐个引用数组元对数组的使用只有逐个引用数组元 素,而不能将数组做为整体引用。素,而不能将数组做为整体引用。通常,可以利用数组下标的变化,来实现数组元通常,可以利用数组下标的变化,来实现数组元素的素的“弹出弹出”
17、。换句话说,可以用不同的方法,。换句话说,可以用不同的方法,引起下标的变化,从而使用数组元素一一地呈现出引起下标的变化,从而使用数组元素一一地呈现出来,以达到对数组元素引用的目的。来,以达到对数组元素引用的目的。数组名数组名 下标下标 其中,下标可以是整常数或整型表达式。其中,下标可以是整常数或整型表达式。C C语言规定语言规定:下标是从:下标是从0 0开始的。开始的。若数组定义为:若数组定义为:int a10int a10;其下标值分别为:其下标值分别为:0 0、1 1、2 2、8 8、9 9。其对应的数组元素分别为:其对应的数组元素分别为:a1a1、a2a2、,a8a8、a9a9。不能存在
18、数组元素。不能存在数组元素a10a10。#include“stdio.h”#include“stdio.h”void main()void main()int a10,i;int a10,i;for(i=0;i10;i+)for(i=0;i10;i+)ai=i;ai=i;for(i=0;i10;i+)for(i=0;i10;i+)printf(printf(%d%d,ai);,ai);程序运行结果如下:程序运行结果如下:0 1 2 3 4 5 6 7 8 90 1 2 3 4 5 6 7 8 9 程序使程序使a0a0a9a9的的值分别为值分别为0 09 9,然后按,然后按下标的顺序依次输出各下
19、标的顺序依次输出各元素中的值。元素中的值。【例例5.35.3】设设X X,Y Y是是m m维向量:维向量:X=x1,x2,xm,X=x1,x2,xm,Y=y1,y2,ym,Y=y1,y2,ym,试编写一程序,用以计算:向量和试编写一程序,用以计算:向量和A=X+Y,A=X+Y,向量差向量差B=X-Y,B=X-Y,向量与标量积之和向量与标量积之和 C=rX+sY,C=rX+sY,其其中中r=1.2,s=2.4r=1.2,s=2.4。#include#includestdiohstdioh#define M,10#define M,10void main()void main()float aM,
20、bM,cM;float aM,bM,cM;float xM,yM;float xM,yM;float r=1.2,s=2.4;float r=1.2,s=2.4;int i;int i;for(i=0;iM;i+)for(i=0;iM;i+)scanf(%f,%f,&xi,&yi);scanf(%f,%f,&xi,&yi);for(i=0;iM,i+)for(i=0;iM,i+)ai=xi+yi;ai=xi+yi;bi=xi-yi;bi=xi-yi;ci=r ci=r*xi+sxi+s*yi;yi;for(i=0;iM;i+)for(i=0;i a01=a02=:a00=a01=a02=a10
21、=a11=a12 a10=a11=a12 又例如:又例如:int b234;int b234;可理解:可理解:b b为三维数组,有为三维数组,有2 23 34 4个元素;个元素;b0,b1b0,b1为二维数组,其各有为二维数组,其各有3 34 4个元素;个元素;b00,b01,b02,b10,b11,b00,b01,b02,b10,b11,b12 b12为一维数组,它们各有为一维数组,它们各有4 4个元素。个元素。因此,对于已定义的三维数组因此,对于已定义的三维数组b b,可有以下四种写法:,可有以下四种写法:b b 书写形式书写形式 bi bi /*数组类型数组类型*/bij bij bij
22、k bijk /*数组元素数组元素*/其中前三种形式为数组类型,只有第种形式是数组其中前三种形式为数组类型,只有第种形式是数组元素,可以作为运算对象进行处理。元素,可以作为运算对象进行处理。C C语言的这种表示法语言的这种表示法给多维数组赋值和用指针表示带来很大方便。给多维数组赋值和用指针表示带来很大方便。C C语言中,数组在内存中存储时,是按照其语言中,数组在内存中存储时,是按照其元素下标的顺序依次存储在内存的连续递增的元素下标的顺序依次存储在内存的连续递增的空间中,即从第一个元素直至最后一个元素连空间中,即从第一个元素直至最后一个元素连续存储。多维数组的存储顺序是以最右边下标续存储。多维数
23、组的存储顺序是以最右边下标最先变化为规律最先变化为规律(即即按行存储按行存储)。对于二维数组,其存储顺序是:先存储第一对于二维数组,其存储顺序是:先存储第一行中的元素,再存储第二行中的元素,以此类行中的元素,再存储第二行中的元素,以此类推推 ,直至存储最后一行中的元素。,直至存储最后一行中的元素。a00 a01 a02 a00 a01 a02 a10 a11 a12 a10 a11 a12 a20 a21 a22a20 a21 a22 a00a01a02a10a11a12a20a21a22 同样可以在定义时对多维数组各元素指同样可以在定义时对多维数组各元素指定初始值。定初始值。基本原则:基本原
24、则:对多维数组的各元素赋初值时的数据排对多维数组的各元素赋初值时的数据排列顺序必须与数组各元素在内存中的存储列顺序必须与数组各元素在内存中的存储完全一致。完全一致。1.1.按行对全部数组元素赋初值按行对全部数组元素赋初值 如:如:static int a34=1,2,3,4,static int a34=1,2,3,4,5,6,7,8,9,10,11,12;5,6,7,8,9,10,11,12;把第一对花括号内的数据赋给第一行各元把第一对花括号内的数据赋给第一行各元素,第二对花括号内的数据赋给第二行各元素,第二对花括号内的数据赋给第二行各元素,第三对花括号内的数据赋给第三行各元素。素,第三对花
25、括号内的数据赋给第三行各元素。这种按行赋初值的方法比较直观,是较常使用这种按行赋初值的方法比较直观,是较常使用的方法。的方法。2.2.按数组元素的存储顺序依次对全部数组元素按数组元素的存储顺序依次对全部数组元素 赋初值。赋初值。如:如:static int static int a34=1,2,3,4,5,6,7,8,9,10,11,12;a34=1,2,3,4,5,6,7,8,9,10,11,12;由于多维数组的各元素是按行存储的,故这种赋初值方由于多维数组的各元素是按行存储的,故这种赋初值方法与上述按行赋初值方法效果一样。法与上述按行赋初值方法效果一样。赋初值后数组各赋初值后数组各元素为:
26、元素为:1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 9 10 11 12 9 10 11 12 与第与第2 2种方法相比,第种方法相比,第1 1种方法好,一行对一行,界限清种方法好,一行对一行,界限清楚。用第楚。用第2 2种方法,如果数据多写成一大片时,容易遗种方法,如果数据多写成一大片时,容易遗漏,也不易检查。漏,也不易检查。3.3.对部分数组元素赋值初值对部分数组元素赋值初值 如:如:static int a34=1,5,9;static int a34=1,5,9;赋初值后数组各元素为:赋初值后数组各元素为:1 0 0 0 1 0 0 0 5 0 0 0 5 0 0
27、0 9 0 0 0 9 0 0 0 相当于只对各行第相当于只对各行第1 1列元素赋值,其余元素自动为列元素赋值,其余元素自动为0 0。也可以对指定行中的制定元素赋初值,如:也可以对指定行中的制定元素赋初值,如:static int a34=1,0,6,0,0,11;static int a34=1,0,6,0,0,11;赋初值后数组各元素为:赋初值后数组各元素为:1 0 0 0 1 0 0 0 0 6 0 0 0 6 0 0 0 0 11 0 0 0 11 0 若对全部数组元素都赋初值,则第一维长度若对全部数组元素都赋初值,则第一维长度可省略不写,但第二维长度不能省。如:可省略不写,但第二维长
28、度不能省。如:static int a 4=1,2,3,4,5,6,7,8,9,10,11,12;static int a 4=1,2,3,4,5,6,7,8,9,10,11,12;与下面的定义等价:与下面的定义等价:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;static int a34=1,2,3,4,5,6,7,8,9,10,11,12;系统会根据数据总个数自动分配存储空间,系统会根据数据总个数自动分配存储空间,一共一共1212个数据,每行个数据,每行4 4列,则确定为列,则确定为3 3行。行。(1)(1)对简单变量在任何场合对简单变量在任何场合(
29、函数内部或外部,静态或非静态函数内部或外部,静态或非静态)均可均可置初初;而数组初始化的条件是:对外部数组置初初;而数组初始化的条件是:对外部数组(函数外说明的函数外说明的数组数组)或静态数组或静态数组(静态的概念见下章静态的概念见下章)可置初值;反之,对函可置初值;反之,对函数内的非静态数组不能置初值。数内的非静态数组不能置初值。(2)(2)外部和静态数组与简单变量一样在编译时得到初值,不占用运外部和静态数组与简单变量一样在编译时得到初值,不占用运行时间;非静态局部变量行时间;非静态局部变量 (函数或复合语句内说明的变量函数或复合语句内说明的变量)在在进入函数或复合语句时得到初值,占用运行时
30、间,多次进入进入函数或复合语句时得到初值,占用运行时间,多次进入多次重新赋初值。多次重新赋初值。(3)(3)外部或静态数组以及简单变量未进行初始化时,等价于置零外部或静态数组以及简单变量未进行初始化时,等价于置零(数值类型数值类型)或空格符或空格符(字符字符 型型)。局部变量未进行初始化时,。局部变量未进行初始化时,是不定值。其值的确定依赖于调用函数或进入复合语句的环是不定值。其值的确定依赖于调用函数或进入复合语句的环境。境。多维数组与一维数组一样必须多维数组与一维数组一样必须“先定先定义,后引用义,后引用”。多维数组元素的一般形式为:多维数组元素的一般形式为:数组名数组名 下标下标下标下标
31、其中,下标可以是整常数或整型表达式。其中,下标可以是整常数或整型表达式。【例例5.45.4】将二维数组将二维数组a23a23中的元素按其存中的元素按其存 储顺序复制到一维数组储顺序复制到一维数组b6b6中。中。#include“stdio.h”#include“stdio.h”void main()void main()static int a23=1,2,3,4,5,6;static int a23=1,2,3,4,5,6;int b6,i,j;int b6,i,j;for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)bi bi*3
32、+j=aij;3+j=aij;for(i=0;i6;i+)for(i=0;i6;i+)printf(%d,bi);printf(%d,bi);程序运行结果如下:程序运行结果如下:1 2 3 4 5 6 1 2 3 4 5 6 二维数组二维数组a23a23向一维数组向一维数组b6b6按存储顺序复制元按存储顺序复制元素值时,其下标的对应关系为素值时,其下标的对应关系为:k=i k=i*D+j D+j 其中,其中,D D为为a23a23中第二维的长度,其值为中第二维的长度,其值为3 3,故程,故程序中序中b b的下标为的下标为i i*3+j3+j。推广到一般,多维数组按存储顺序转换成一维数组推广到一
33、般,多维数组按存储顺序转换成一维数组时,其下标的对应关系由下式给出:时,其下标的对应关系由下式给出:k=k=第一维下标值第一维下标值D2D2D3D3Dk+Dk+第二维下标值第二维下标值D3D3D4D4Dk+Dk+第三维下标值第三维下标值D4D4D5D5Dk Dk +第第k-1k-1维下标值维下标值Dk+Dk+第第k k维下标值维下标值 其中,其中,Di(i=2,Di(i=2,,k)k)是多维数组第是多维数组第i i维的长度。维的长度。例如,有数组定义为例如,有数组定义为 num4567 num4567 其转换成一维数组时,按存储顺序有:其转换成一维数组时,按存储顺序有:k=ik=i*5 5*6
34、 6*7+j7+j*6 6*7+l7+l*7+m 7+m i i 是第一维下标值是第一维下标值 j j 是第二维下标值是第二维下标值 l l 是第三维下标值是第三维下标值 m m 是第四维下标值是第四维下标值 事实上,这里的事实上,这里的k k就是多维数组元素在内存中存储就是多维数组元素在内存中存储位置的序号。位置的序号。#include“stdio.h”#include“stdio.h”void main()void main()static int a4=5,2,1,6,2,5,7,4,8,10,5,6,5,2,4,5;static int a4=5,2,1,6,2,5,7,4,8,10,
35、5,6,5,2,4,5;int i,j,k,x;int i,j,k,x;x=5;x=5;k=0;k=0;for(i=0,i4;i+)for(i=0,i4;i+)for(j=0,j4;j+)for(j=0,j4;j+)if(aij=x)k=k+1;if(aij=x)k=k+1;printf(%d,k);printf(%d,k);程序中使用了整型变量k作为计数器,每当找到一个与x值相等的元素时,计数器k就加1。当所有元素找完时,k中就是元素值为5的元素个数。使用计数器之前,应清零(赋初值为0)。【例例5.65.6】查找数组查找数组a222a222中的最小元素值。中的最小元素值。#include“s
36、tdio.h”#include“stdio.h”void main()void main()static int a222=1,2,3,4,5,6,7,0;static int a222=1,2,3,4,5,6,7,0;int i,j,k,small;int i,j,k,small;small=a000;small=a000;for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j2;j+)for(j=0;j2;j+)for(k=0;k2;k+)for(k=0;k2;k+)if(aijksmall)small=aijk;if(aijksmall)small=aijk;prin
37、tf(%d,small);printf(%d,small);数组在数组在C C语言程序设计中有着广泛地应用。语言程序设计中有着广泛地应用。而且有的应用包含了较为复杂的数组操作。而且有的应用包含了较为复杂的数组操作。但无论其操作多么复杂,它们都是由一些但无论其操作多么复杂,它们都是由一些基本的操作组合起来的。基本的操作组合起来的。一、排序一、排序(sorting)(sorting)排序排序:是把一组数据按其值的递增是把一组数据按其值的递增(升序升序)或递减或递减(降序降序)的次序排列起来,使一个无序组成为一个有序组。的次序排列起来,使一个无序组成为一个有序组。对于数组的排序,则是把数组元素按其值
38、递增或递减对于数组的排序,则是把数组元素按其值递增或递减的次序排列的次序排列 。排序是数据处理中常见的操作。排序有。排序是数据处理中常见的操作。排序有许多方法,这里不讨论各种排序方法的优劣,只介绍排许多方法,这里不讨论各种排序方法的优劣,只介绍排序中如何对数组元素进行操作。选择排序是诸多排序算序中如何对数组元素进行操作。选择排序是诸多排序算法的一种。法的一种。基本做法:多次重复地找出数组中最小值基本做法:多次重复地找出数组中最小值(或最大值或最大值),并依据被找到的先后次序将数组元素排列起来。下面,并依据被找到的先后次序将数组元素排列起来。下面只讨论升序选择排序。只讨论升序选择排序。设整形数组
39、设整形数组a a中有中有n n个元素,第一次选择是从个元素,第一次选择是从n n个元个元素中选择素中选择(找出找出)值最小的元素,将其与数组中的第一值最小的元素,将其与数组中的第一个元素交换,于是,第一个元素就成为值最小的元素。个元素交换,于是,第一个元素就成为值最小的元素。第二次选择是从数组中第二个元素起的第二次选择是从数组中第二个元素起的(n-1)(n-1)个元素个元素中选择值最小的元素,将该元素与数组的第二个元素中选择值最小的元素,将该元素与数组的第二个元素进行交换,于是,第二个元素也排好序。如此进行第进行交换,于是,第二个元素也排好序。如此进行第三次、第四次,第五次三次、第四次,第五次
40、.。每选择一次,就排好一。每选择一次,就排好一个元素的次序,所余下来排序的元素就减少一个。选个元素的次序,所余下来排序的元素就减少一个。选择择(N-1)(N-1)次后,只余下一个元素次后,只余下一个元素(数组中最大的元素)数组中最大的元素),排序就完成了。,排序就完成了。例如:例如:有一数组有一数组a7a7其元素值及其初始次序为:其元素值及其初始次序为:4 4、5 5、9 9、1212、1717、3 3、1 1 根据上述选择排序方法,每次选择后各元素的次序可表根据上述选择排序方法,每次选择后各元素的次序可表述如下:述如下:数组初始状态:数组初始状态:44,5 5,9 9,1212,1717,3
41、 3,1 1 第一次选择后:第一次选择后:1 1,55,9 9,1212,1717,3 3,4 4 第二次选择后:第二次选择后:1 1,3 3,99,1212,1717,5 5,4 4 第三次选择后:第三次选择后:1 1,3 3,4 4,1212,1717,5 5,9 9 第四次选择后:第四次选择后:1 1,3 3,4 4,5 5,1717,1212,9 9 第五次选择后:第五次选择后:1 1,3 3,4 4,5 5,9 9,1212,17 17 第六次选择后:第六次选择后:1 1,3 3,4 4,5 5,9 9,1212,17 17 至此该数组排序完毕。至此该数组排序完毕。归纳起来,选择排序
42、的基本方法归纳起来,选择排序的基本方法是先选出最小值元素和第一个元素交是先选出最小值元素和第一个元素交换位置,然后,再对剩下的换位置,然后,再对剩下的n-1n-1个元素个元素重复这样的选择和交换,这样不断重重复这样的选择和交换,这样不断重复至所有的元素都被排序为止。复至所有的元素都被排序为止。#include“stdio.h”#include“stdio.h”void main()void main()int a10,i,j,;int a10,i,j,;int temp,min;int temp,min;printf(Enter 10 numbers:printf(Enter 10 numbe
43、rs:n);n);for(i=0;i10;i+)for(i=0;i10;i+)scanf(%d,&ai);scanf(%d,&ai);for(i=0;i9;i+)for(i=0;i9;i+)k=i+1;k=i+1;min=i;min=i;for(j=k;j10,j+)for(j=k;j10,j+)if(ajamin)min=j;if(ajamin)min=j;temp=ai;temp=ai;ai=amin;ai=amin;amin=temp;amin=temp;for(i=0;i10;i+)for(i=0;i10;i+)printf(%d,ai);printf(%d,ai);输入输入:-10
44、9 1 0-24 220 88 12 95 4-10 9 1 0-24 220 88 12 95 4 程序运行结果如下:程序运行结果如下:Enter 10 numbers:Enter 10 numbers:-10 9 1 0-24 220 88 12 95 4-10 9 1 0-24 220 88 12 95 4 The sorted numbers:The sorted numbers:-24,-10,0,1,4,9,12,88,95,220-24,-10,0,1,4,9,12,88,95,220 查找也是数据处理中常见的操作。对于数组的查找,查找也是数据处理中常见的操作。对于数组的查找,则
45、是按给定值在数组中寻找与给定值相同的数组元素。则是按给定值在数组中寻找与给定值相同的数组元素。查找:指在一数组数据中寻找某一特定数据的过程。查找:指在一数组数据中寻找某一特定数据的过程。查找的方法很多,选择使用何种方法除了人为因素查找的方法很多,选择使用何种方法除了人为因素外,有时还取决于具体数组的特征。外,有时还取决于具体数组的特征。未排序的数组:未排序的数组:采用顺序查找法而不能用折半查找法;采用顺序查找法而不能用折半查找法;已排序的数组已排序的数组 既可采用顺序查找法,也可以用折半查找法。既可采用顺序查找法,也可以用折半查找法。顺序查找法是最简单的查找方法。若有一顺序查找法是最简单的查找
46、方法。若有一数组为数组为anan,给定数组元素的查找值为,给定数组元素的查找值为x x,查,查找时,先从数组的第一个元素找时,先从数组的第一个元素a0a0查起,接着查起,接着查第二个元素查第二个元素a1a1,第三个元素,第三个元素a2.a2.,直,直到查找出所需找的数组元素或判定出不存在的到查找出所需找的数组元素或判定出不存在的需找的元素为止。无论是未排序或已排序的数需找的元素为止。无论是未排序或已排序的数组,都可以用顺序查找法。组,都可以用顺序查找法。设有一数组设有一数组a10a10,x x为需查找的数组元素为需查找的数组元素 值,其顺序查找的程序如下:值,其顺序查找的程序如下:#inclu
47、de“stdio.h”#include“stdio.h”void main()void main()static int a10=3,6,9,10,12,15,1,4,2,5;static int a10=3,6,9,10,12,15,1,4,2,5;int x,i,t=0;int x,i,t=0;scanf(%d,&x);scanf(%d,&x);for(i=0;i10;i+)for(i=0;i10;i+)if(ai=x)printf(a%d=%d,i,ai);t=1;if(ai=x)printf(a%d=%d,i,ai);t=1;if(t=0)printf(No found);if(t=0
48、)printf(No found);运行结果运行结果:输入输入 12 12 输入输入 9999 输出输出 a4=12 a4=12 输出输出 No foundNo found 顺序查找的算法简单,程序易于实现,但它的查找效率顺序查找的算法简单,程序易于实现,但它的查找效率不高。如果要查找的数组元素很多,则宜采用折半查找法。不高。如果要查找的数组元素很多,则宜采用折半查找法。折半查找法仅适合于已排序的数组。折半查找法仅适合于已排序的数组。折半查找的基本思想:折半查找的基本思想:找出数组的中项,如果它就是要查的那个元素,则找出数组的中项,如果它就是要查的那个元素,则 查找结束。查找结束。否则,应判断
49、所查元素位于数组中那个部分,然后否则,应判断所查元素位于数组中那个部分,然后 保留其所在的一半,舍弃无用的一半。保留其所在的一半,舍弃无用的一半。接着找出保留那一半的中项,重复上述的判断操作。接着找出保留那一半的中项,重复上述的判断操作。如此一次次地继续下去,直到某次查找的中项恰好等于如此一次次地继续下去,直到某次查找的中项恰好等于查找值或余下一个数组元素为止。查找值或余下一个数组元素为止。设有一升序数组设有一升序数组akak,要查找与,要查找与x x相等的元素值。查相等的元素值。查找步骤如下:找步骤如下:(1)n=0;m=k;(1)n=0;m=k;(2)(2)计算中项计算中项 i=(n+m)
50、/2;i=(n+m)/2;(3)(3)若若ai=x ai=x 或或 m=n,m=n,则查找结束;否则,继续下则查找结束;否则,继续下 去;去;(4)(4)若若aix(xaix(xaix(x值在中项元素值的左边值在中项元素值的左边),则将,则将m=i-m=i-1 1,转去执行,转去执行(2)(2)。#include stdio.h#include stdio.hvoid main()void main()static int a10=5,7,8,14,25,36,44,50,69,80;static int a10=5,7,8,14,25,36,44,50,69,80;int i,n,m,x;i