c语言第6章数组.ppt_第1页
c语言第6章数组.ppt_第2页
c语言第6章数组.ppt_第3页
c语言第6章数组.ppt_第4页
c语言第6章数组.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章 数 组,本章要求:,1. 理解数组的概念。 2. 掌握一维数组与二维数组的定义与使用方法。 3. 掌握使用字符数组处理字符串的方法。 4. 掌握数组的基本算法:排序、查找与插入。,重点:,一维数组、二维数组的定义与使用方法,难点:,用数组处理字符及排序、查找与插入等算法,输入10个数,输出它们的平均值及大于平均值的那些数?,引例:,main( ) int n, a, s=0; float ave; for (n=1;n=10;n+) scanf(“%d”, ,输入10个数,输出它们的平均值及大于平均值的那些数。,引例:,如果使用:a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, s, n; float ave; scanf(“%d%d%d%d%d”, 实际程序是不能这样写的,引例:,思考: 如果能使用ai ( i=1,2,10 ) 的形式,使用循环来写程序: for( i=1 ; i ave) printf(“%d”, ai ); C语言中表示下标变量就是通过定义数组来实现的。,第6章 数 组,6.1 一维数组 6.2 二维数组 6.3 字符数组与字符串 6.4 程序范例,在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在语言中,数组属于构造类型,在内存中占用一片连续的存储单元。,6.1一维数组,注意: 数组中数据元素的类型决定了每个存储单元的空间大小。,6.2 一维数组,只有一个下标变量的数组,称为一维数组。 1、一维数组声明 一般形式为: 类型符 数组名 常量表达式; 其中,方括号中的常量表达式表示数据元素的个数,也称为数组的长度。 例如:int a10; float b10,c20; char ch20;,说明: (1)对于同一个数组,其所有元素的数据类型都是相同的。 (2)数组名不能与同一函数中其它变量名相同。 例如:int a; float a10; /*错误*/,1、一维数组的声明,(3)C语言中规定数组的下标从0开始。 例如:int a5 表示数组a有5个元素,分别为a0,a1,a2,a3,a4。 (4)不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: #define FD 5 int a3+2,b7+FD; /*合法*/ int n=5; int an; /*错误*/,1、一维数组的声明,数组初始化赋值是指在数组说明时给数组元素赋予初值。 数组初始化是在编译阶段进行的。,2、 一维数组的初始化,例如: int a10= 0,1,2,3,4,5,6,7,8,9 ;,数组初始化的一般形式为: 类型符 数组名常量表达式=值,值值; 其中: 在 中的各数据值即为各元素的初值,各值之间用逗号间隔。,语言对数组的初始赋值的几点规定: (1)可以只给部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。 例如: int a10=0,1,2,3,4; int a10=0,1,2,3,4,0,0,0,0,0; (2)只能给元素逐个赋值,不能给数组整体赋值,2、 一维数组的初始化,例如给十个元素全部赋1值,只能写为: int a10=1,1,1,1,1,1,1,1,1,1; 而不能写为: int a10=1;,(3)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。 例如: int a=1,2,3,4,5; (4)当 中值的个数多于元素个数时, 系统出错。,2、 一维数组的初始化,例如:int a5=1,2,3,4,5,1 ;,数组元素是组成数组的基本单元。 其一般引用形式为: 数组名下标 其中的下标只能为整型常量或整型表达式。 例如:a5, ai+j, ai+ 数组元素可以作为普通变量使用。,3、 数组元素的引用,a1=5; ai=bj; ai+1=ai+6;,注意: (1)数组元素的引用和数组声明在形式中有些相似 例如,int a10; a5=8;,3、 数组元素的引用,思考: 程序中能否出现a10? 这两者具有完全不同的含义。前者只能是常量,后者可以是常量,变量或表达式。,(2)C语言中对数组的引用不检验数组边界,C系统虽然不出错,但可能使其它变量的数组甚至程序代码被破坏,使得程序运行中断或输出错误的结果。 (3)在语言中只能通过下标变量使用数组元素,而不能一次引用整个数组。,3、 数组元素的引用,int a5; printf(“%d“, a);,1. 数组元素数据的输入 int a10, i; for( ; ; ) scanf(“ ”, );,4、一维数组的基本操作,&ai,2. 数组元素数据的输出 for( i=0 ; i10 ; i+ ) printf(“%d“, );,ai,%d,i=0,i=9,i+,例1 输入N个数据存入数组中,输出其中的最大元素。 分析: 1、定义变量? int aN, max ; 2、输入数据 ? for(i=0;i max) max = ai; 4、如何确定最大值位置?,4、 一维数组的基本操作, p=i; /*补充定义变量p*/,main( ) int i, p, max, aN; for(i=0;i max) max = ai; p = i; printf(“ The Max Numbwer a%d=%dn“,p,max); ,4、 一维数组的基本操作,#define N 5,例1 输入N个数据存入数组中,输出其中的最大元素。,printf(“Enter %d Numbers:n“, N); /* 提示输入数据 */,4、 一维数组的基本操作,例2 输入N个数据存入数组中,将其倒置存放,并打印输出。,a0 a1 a2 a3 a4 a5 a6 a7,a0 a1 a2 aN-2 aN-1,?,aN/2-1,ai,aN-i-1,4、 一维数组的基本操作,例2 输入N个数据存入数组中,将其倒置存放,并打印输出。,for( ; ; ),i=0,i= N/2-1,i+, t=ai; ai=aN-i-1; aN-i-1=t; ,main( ) int i, t, aN; printf(“Enter %d Numbers:n“, N); /* 提示输入数据 */ for(i=0;iN;i+) scanf(“%d“, ,4、 一维数组的基本操作,#define N 5,例4-2 输入N个数据存入数组中,将其倒置存放,并打印输出。,5、 一维数组的应用举例,例3 编程求某班20个学生某门课程考试的平均成绩及高于平均成绩的学生人数。,sum =sum + ai; /* 求班总成绩 */ aver = sum / NUM;,if (aiaver) n+;,平均成绩?(设已经宏定义人数为NUM),高于平均成绩的人数?,sum=0; for(i=0;iNUM;i+) scanf(“%d“, ,n = 0; for(i=0;iNUM;i+),5、 一维数组的应用举例,#define NUM 20 /* 声明代表班上学生人数的符号常量*/ main( ) int aNUM, i, n; float sum, aver ; sum = 0; printf(“Enter Student Scoren“); /* 提示用户输入学生成绩*/ for(i=0;iaver) n+; printf(“The Class Average Score is:%fn“ ,aver); printf(“The Total Number is:%dn“,n); ,二维数组声明的一般形式是: 类型符 数组名行数列数; 例如: int a34; 定义了一个3行4列的数组,该数组的下标变量共有34个,即: a00, a01, a02, a03 a10, a11, a12, a13 a20, a21, a22, a23,6.2 二维数组,1、 二维数组的声明,注意: 二维数组在内存中的存放顺序是按行存储的。即放完一行之后顺次放入第二行。二维数组在内在中占一片连续存储空间。 例如: int a34;,1、 二维数组的声明,二维数组的元素的引用形式为: 数组名行下标列下标 其中下标应为整型常量或整型表达式。,2、 二维数组元素的引用,例如: int a34; a23=10; a12=2*a23;,例如:a34表示数组a中第3行第4列的元素。 注意: 下标元素与数组定义的区别,例5 一个学习小组有5个人,每个人有3门课的考试成绩,求每人的平均成绩。,2、 二维数组元素的引用,学号 Math English C 1 80 75 92 2 61 65 71 3 59 63 70 4 85 87 90 5 76 97 85,a0 a1 a2 a3 a4,aver0 aver1 aver2 aver3 aver4,人,平均成绩,a0j a1j a2j a3j a4j,成绩,i,i,程序如下: main() int i,j,a53; float ave5=0; for(i=0;i5;i+) for(j=0;j3;j+) scanf(“%d”, ,2、 二维数组元素的引用,二维数组初始化也是在类型说明时给各下标变量赋以初值。 二维数组可按行分段赋值,也可按行连续赋值。 1. 按行分段赋值可写为 int 53=80,75,92,61,65,71,59,63,70, 85,87,90,76,77,85; 2. 按行连续赋值可写为 int a53= 80,75,92,61,65,71,59,63, 70,85,87, 90,76,77,85 ; 这两种赋初值的结果是完全相同的。,3、 二维数组的初始化,二维数组初始化赋值说明: 1. 可以只对部分元素赋初值。 例如: int a33=1,2,3; 行尾未赋值的元素取0值。,1 0 0 2 0 0 3 0 0,1 0 0 0 2 0 0 0 3,2. 如对全部元素赋初值,则第一维的长度可以不给出。 例如: int a33=1,2,3,4,5,6,7,8,9; int a 3=1,2,3,4,5,6,7,8,9;,而: int a 33=1,0,2,0,0,3;,3、 二维数组的初始化,二维数组的操作一般需要使用二重循环。 设已经定义整型数组aNM。 1给二维数组a输入数据 for(i=0;iN;i+) for(j=0;jM;j+) scanf(“%d”,4、 二维数组的基本操作,例6 输出下面二维数组中的最大元素及其下标。,main( ) int i, j, row=0, colum=0, max; int a34=12, 23, 3, 5,45, 32, 56, 6, 9, 16, 34, 21; max=a00; for(i=0;imax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%dn“,max,row,colum); ,4、 二维数组的基本操作,设a是M*N的矩阵,可以定义另一个二维数组b存放转置后的矩阵。 如何定义数组b? int bNM;,算法: bji = aij,4、 二维数组的基本操作,for(i=0; iM; i+) for(j= 0; jN; j+) bji=aij;,例7 将矩阵转置存放,并打印输出。,4、二维数组的基本操作,例8 将矩阵转置存放,并打印输出。,如果是方阵,即a是N*N的二维数组,则可以不必定义另一数组。方阵的转置以对角线为基准,对应元素交换。,转置 =,对角线? i=j,a01,a10,a01,a10,i? 0 N-1,j? i+1 N-1,4,2,4、二维数组的基本操作,#define N 3 void main( ) int i, j, t; int aNN=1,4,7,2,5,8,3,6,9; for(i=0; iN; i+) for(j=i+1; jN; j+) t=aij; aij=aji; aji=t; for(i=0;iN;i+) /* 打印输出转置后的矩阵 */ for(j=0;jN;j+) printf(“%d “,aij); printf(“n“); /* 换行 */ ,对角线? i=j,i? 0 N-1,j? i+1 N-1,在处理三维空问题等其它复杂问题时要使用到三维及三维以上的数组,通常把三维及三维以上的数组称为多维数组。,5、 多维数组的声明和引用,定义多维数组的格式如下: 类型符 数组名常量1常量2常量3; 例如: int a555; /* 声明a是三维数组*/ float b26105; /* 声明b是四维数组*/,多维数组的使用与二维数组的使用大同小异,只要确定各维的下标值,就可以使用多维数组的元素了。操作多维数组常常要用到多重循环,一般每一循环控制一维下标。要注意下标的的位置和取值范围。,一、字符数组的定义 字符数组类型说明的形式与前面介绍的数值数组相同。 例如: char c10; 定义有10个元素的数组 例如: char ch510; 即为5*10 的二维字符数组。 二、字符数组的初始化 字符数组也可在定义时作初始化赋值。 (1)逐个元素初始化,当初始化数据少于数组长度,多余元素为“空”(0),当初始化数据多于元素个数时,将出错。 例如: char c10=c, ,p,r,o,g,r,a,m; 赋值后各元素的值为:其中c9未赋值,由系统自动赋予为空字符0 值。,6.3字符数组与字符串,1、 字符数组与初值化,数组在内在中的存放形式如图所示:,char c5= I, ,a,m, ,a, ,b,o, y /* 出错,太多的初始化值 */ char d210= I, ,a,m, ,a, ,b,o, y,G,o,o,d, ,b,o,y 二维数组d初始化后,在内存中的存放形式如图所示:,1、 字符数组与初值化,(2) 指定初值时,若未指定数组长度,则长度等于初值个数。 char c = I, ,a,m, ,h,a,p,p,y; 等价于char c10 = I, ,a,m, ,h,a,p,p,y; 数组c在内在中的存放形式如图所示:,(3)使用赋值语句逐个元素赋值,例如: char c10; c0=I; c1= ; c2=a; c3=m; c4= ; c5=h; c6=a; c7=p; c8=p; c9=y;,1、 字符数组与初值化,引用字符数组一个元素,得到一个字符。其引用形式与数值数组相同,例 输出一个字符串,依次输出字符数组中的每一个元素。 void main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(“%c“,ci); printf(“n“); ,输出结果:I am a boy,2、 字符数组的引用,例 使用二维字符数组输出如下字母塔图形。 A B B C C DDDDDDD 程序如下 void main() char cd7= , , ,A, , , , , ,B, ,B, , , ,C, , , ,C, ,D,D,D,D,D,D,D; int i,j; for(i=0;i4;i+) for(j=0;j7;j+) printf(“%c“,cdij); printf(“n“); /* 换行 */ ,2、 字符数组的引用,在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。 字符串总是以0作为串的结束符。因此当把一个字符串存入一个数组时, 也把结束符0存入数组,并以此作为该字符串是否结束的标志。 有了0标志后,就不必再用字符数组的长度来判断字符串的长度了。 实际上,字符串就是一种字符型数组,并且这个数组的最后一个单元是一个字符结束标志“0”,也就是说字符串是一种以“0”结尾的字符数组。,3、 字符串与字符数组,1字符数组可以用字符串来初始化,例如 语言允许用字符串的方式对数组作初始化赋值。 例如: char c=C, ,p,r,o,g,r,a,m , 0,; 可写为: char c=“C program“; 或去掉写为: char c=“C program“;,数组的在内存存放情况:,3、 字符串与字符数组,2、字符串在存储时,系统自动在其后加上结束标志0(占1字节,其值为二进制0)。但字符数组并不要求其最后一个元素是0,例如要注意下面数组使用的区别: char c15=G,o,o,d,! char c2=“Good!“; 上面的定义不等价,字符数组c1不能当字符串使用,因为其最后一个元素不是结束标志。,3、 字符串与字符数组,#include“stdio.h“ void main() char c15=G,o,o,d,!; char c2=“Good!“; printf(“%sn“,c1); printf(“%sn“,c2); ,例如:,字符数组的输入输出一般采用下面两种方法: 可用printf函数和scanf函数中使用“%s”格式控制符一次性输出输入一个字符数组中的字符串。 1、用“%c”格式符逐个输入输出。 2、用“%s”格式符按字符串输入输出。,4、字符数组的输入输出,例如,有定义:char c6; 可使用如下2个语句来输入输出。 scanf(“%s“,c); printf(“%s“,c);,说明: (1)输出时,遇0结束,且输出字符中不包含0。 (2)“%s”格式输出字符串时,printf()函数的输出项是字符数组名,而不是元素名。 char c = “Good!“; printf(“%s“,c); printf(“%c“,c0); printf(“%s“,c0); /* 错误 */ (3)“%s”格式输出时,即使数组长度大于字符串长度,遇0也结束。 例如:char c10 = “Good!“; printf(“%s“,c); /*只输出5个字符 */,4、 字符数组的输入输出,说明: (4)“%s”格式输出时,若数组中包含一个以上0,遇第一个0时结束。 例如:char c = “Good!0boy“; printf(“%s“,c); 只输出结果是:Good! (5)输入时,遇回车键结束,但获得的字符中不包含回车键本,而是在字符串末尾添0。因此,定义的字符数组必须有足够的长度,以容纳所输入的字符。(如,输入5个字符,定义的字符数组至少应有6个元素)。,4、 字符数组的输入输出,说明: (6)一个scanf函数输入多个字符串,输入时以“空格”键作为字符串间的分隔。 例如:char str15,str25,str35; scanf(“%s%s%s“,str1,str2,str3); 输入数据:How are you? str1、str2、str3获得的数据如图4-8所示。,4、 字符数组的输入输出,说明: (7) C语言中,数组名代表该数组的起始地址,因此,scanf()函数中不需要地址运算符 /* 此语句是错误的 */,4、 字符数组的输入输出,语言提供了丰富的字符串处理函数, 它们可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减化字符处理的编程。 用于输入输出的字符串函数, 在使用前应包含头文件“stdio.h“ ; 使用其它字符串函数则应包含头文件“string.h“。 下面介绍几个最常用的字符串函数。 1.字符串输出函数 puts 格式: puts (str) ;,Str为数组名或指针变量,功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示。 它等价于: printf(“%sn“,str);,5、 字符串处理函数,例如:若有定义 char c=“Chi0na“; 则 语句puts(c); 的输出结果为: Chi 语句puts(c+1); 的输出结果为: hi 语句puts(c+4); 的输出结果为: na,2.字符串输入函数gets 格式: gets (str),Str为数组名或指针变量,功能:从键盘上输入一个字符串直到回车键结束。 将输入结束的回车转换为0,存放到数组或字符指针所指向的一片存储单元。 注意:gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。,5、 字符串处理函数,例 字符串的输入示例 #include “stdio.h“ void main() char st120,st220; printf(“input string:n“); gets(st1); scanf(“%s“,st2); puts(st1); puts(st2); ,程序运行结果是:,从上面的运行结果,可以看出当输入的字符串中含有空格时,使用gets()和scanf()输出的不同。,5、 字符串处理函数,3.字符串连接函数strcat 格式: strcat (str1,str2) 功能:把字符数组str2中的字符串连接到字符数组str1 中字符串的后面,并删去字符串1后的串标志“0”。本函数返回值是字符数组的首地址。 例 字符串的连接示例 #include “string.h“ #include“stdio.h“ void main() char st130=“My name is “; char st210; printf(“input your name:n“); gets(st2); strcat(st1,st2); puts(st1); ,5、 字符串处理函数,4.字符串拷贝函数strcpy 格式: strcpy (str1,str2) 功能:把字符数组str2中的字符串拷贝到字符数组str1中。串结束标 志“0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 例: #include“string.h“ main() char st115,st2=“C Language“; strcpy(st1,st2); puts(st1);printf(“n“); ,5、 字符串处理函数,5.字符串比较函数strcmp 格式: strcmp(str1,str2) 功能:比较两个字符串,返回值为比较结果。 str1str2, 返回值0; str1str2, 返回值0; str1str2, 返回值0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。 本函数的返回值为首次出现不同字符时,str1中不同字符-str2中不同字符。,5、 字符串处理函数,例 字符串比较操作示例 #include “string.h“ void main() int k; char st115,st2=“C Language“; printf(“input a string:n“); gets(st1); k=strcmp(st1,st2); if(k=0) printf(“st1=st2n“); if(k0) printf(“st1st2n“); if(k0) printf(“st1st2n“); ,5、 字符串处理函数,6. 测字符串长度函数strlen 格式: strlen(str) 功能:测字符串的实际长度(不含字符串结束标志0) 并作 为函数返回值。,例: #include“string.h“ main() int k; static char st=“C language“; k=strlen(st); printf(“The lenth of the string is %dn“,k); ,5、字符串处理函数,7. 字符大写转小写函数strlwr 格式: strlwr(str) 功能:将字符串str中的大写字母转换为小写字母。 8. 字符小写转大写函数strupr 格式: strupr(str) 功能:将字符串str中的小写字母转换为大写字母。,5、 字符串处理函数,第6章 习题课,在程序设计过程中经常需要处理成批的相关数据,数组是解决此类问题的最佳工具。本节介绍数据排序、查找、字符串处理等与数组有关的常用算法,通过这些问题的处理使读者掌握数组的基本使用方法。,6.4 应用程序举例,数据的排序就是将一批数据由小大到(升序)或由大到小(降序)进行排列。 常用的有选择法、冒泡法等。,1、 排序问题,1选择法排序 算法描述: (降序 ) 设有n个数,存放在数组a0an-1中,1、排序问题,从所有元素中选择一个最大值元素ap放在a0中(即让最大值元素ap与a0交换 );再从a1开始到最后的各元素中选择一个最大值元素ap放在a1中; 依次类推从ai开始到最后的各元素中选择一个最大值元素ap放在ai中;,选择法排序过程:,第1遍:,a0 84 a1 83 a2 88 a3 87 a4 61,第2次:,第3次:,a0 84 a1 83 a2 88 a3 87 a4 61,a0 84 a1 83 a2 88 a3 87 a4 61,a0 84 a1 83 a2 88 a3 87 a4 61,p=0,p,p,p,p,第4次:,第1遍结束:p(=2) != 0 ap a0 ( a0 中放最大值 ),1、 排序问题,第1次:,j=1,84,83,j=2,j=3,j=4,88,87,61,if(p!= i) s=ai; ai=ap; ap=s; ,第五章 数 组,1、 排序问题,第2遍:除第1 个数外,其余n-1个数中选最大的数,与a1交换位置;,p=i; for( ; ; ) if( ),aj ap,j=i+1,jN,j+,p=j;,主要程序段:,i=0;,i=1;,for( ; ; ),i=0,iN-1,i+,思考: 如何升序排序?,例 输入20个数,用选择法由小到大排序,将其打印输出。 #define N 20 main( ) int i, j, p, s, aN; printf(“n input %d numbers:n“, N); for(i=0;iN;i+) scanf(“%d“, ,第五章 数 组,1、 排序问题,经两两相邻比较后,最大的数交换到最后一个位置(aN-1)。,2冒泡法排序(升序) 算法 : 将相邻两个数比较,大数交换到后面。 第1趟:从第一个元素开始将每相邻两个数比较,大数交换到后面。,演示,第五章 数 组,1、 排序问题,a0,a7,第 1 遍,排序前,按升序排序,9,最大数已到最后,6,第五章 数 组,1、 排序问题,算法 :( 升序 ) 第1遍:将N个数每相邻两个数比较,大数交换到后面。,第 2遍:将前N-1个数(最大的数已在最后)按上法比较,得次大的数(aN-2) 。,第五章 数 组,1、 排序问题,经两两相邻比较后,最大的数交换到最后一个位置(aN-1)。,for( ; ; ) if( ),ajaj+1,j=0,jN-1,j+, t=aj; aj=aj+1; aj+1=t;,主要程序段:,i=1;,i=2;,for( ; ; ),i=1,i=N-1,i+,a0,a7 aN-1,第五章 数 组,1、排序问题,a6 aN-2,a5,a4,a3,a2,a1,jN-2,jN-i,#define N 10 main( ) int aN, i, j, t; printf(“input 10 numbers:n“); for(i=0;i aj+1) /* 交换大小 */ t = aj; aj = aj+1; aj+1 = t; printf(“the sorted numbers:n“); for(i=0; iN; i+) printf(“%dt“,ai); ,第五章 数 组,1、 排序问题,2、 数据查找,算法:顺序查找法(在一列数中查找某数x),算法分析: 设有n个数据放在a0-an-1中,待查找的数据值为x,把x与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。,例 在n个数据中,查找某个给的数据x,如果找到,返回该数据位置。,if( ),if( ) printf(“the number is not found!n“); else printf(“the number found is a%dn“,index);,2、 数据查找,for( ; ; ),x=ai,i=0,iN,i+, 找到 ,主要程序段:,index=i; break;,index=-1;,index=-1,#define N 10 void main( ) int aN=12, 34, 1, 3, 67, 89, 28, 61, 9, 87; int index, x, i; printf(“please input the number you want to find:n“); scanf(“%d“, ,2、数据查找,算法:折半查找法(只能对有序数列进行查找),算法分析: 设n个有序数(从小到大)存放在数组a0-an-1中,要查找的数为x。 每次比较x与数组的中间值。若x中间值,则查找范围缩小为后一半数组元素;若x中间值,则查找范围缩小为前一半数组元素;若x=中间值,则找到该值,结束查找。,2、数据查找,例 在一批有序数据序列中查找给定的数x。,算法分析: 用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间(mid=(top+bot)/2) (1)若x=amid,则已找到,退出循环,否则进行下面的判断; (2)若xamid,x必定落在mid+1和top的范围之内,即bot=mid+1; (4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bottop。,2、 数据查找,查找值 x=28,xamid,bot=mid+1,xamid,top=mid-1,2、 数据查找,找到,xamid,bot=mid+1,x=amid,查找值 x=55,xamid,bot=mid+1,xamid,2、数据查找,bot=mid+1,xamid,topbot 没找到,bot=0; top=N-1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论