数组.docx
《数组.docx》由会员分享,可在线阅读,更多相关《数组.docx(6页珍藏版)》请在冰豆网上搜索。
![数组.docx](https://file1.bdocx.com/fileroot1/2022-10/27/62c0243c-1710-4d30-80a6-f652fe80bac1/62c0243c-1710-4d30-80a6-f652fe80bac11.gif)
数组
数组
【引例:
任意读入3个整数,然后逆序输出。
】
main()
{intx,y;
scanf(“%d%d”,&x,&y);
printf(“%d,%d\n”,y,x);
}
【数据量增大时,数据之间的关系若组织不当,即使算法再简单,程序都难以编写。
因此引入新的数据结构(即数据间的组织)数组。
】
数组的特点“有限、有序、同类”。
【用数组改写上例】
#defineN3
main()
{inta[N],k;
for(k=0;k<=N-1;k++)
scanf(“%d”,&a[k]);
for(k=N-1;k>=0;k--)
printf(“%d\n”,a[k]);
}
一、一维数组
1.定义
类型名数组名[整型常量];
2.说明
(1)数组名即与变量命名规则一样。
(2)定义时的[]内只能是正整型常量。
表示数组所含成员(元素)的个数。
(3)数组各元素被分配在连续空间中,低字节中存放数组的第一个元素,下标为0。
inta[5];
则数组a含有5个元素:
a[0]、a[1]、a[2]、a[3]、a[4]。
(4)TC系统对数组下标越界不报错。
注意:
下标必须在0~个数-1之间!
intn=5;
inta[n];/*n是变量*/
×
(5)数组名就是数组的首地址,即第一个元素的地址。
数组名是一个常量。
inta[5];
则a等价于&a[0]
【结论:
数组的每一个元素相当于同类型的一个普通变量。
】
二、数组元素的输入输出
1、数组元素初始化
(1)所有元素在定义时获得值
inta[3]={1,3,5};
或inta[]={1,3,5};
以上两种形式完全等价,即给所有元素初始化时,可以将[]内的常量省略。
*所给值的个数不能多于数组元素个数。
(2)部分元素在定义时获得值
inta[5]={2,4};
则a[0]获值2,a[1]获值4,而其余元素全都获值0。
【本学期的定义格式情况下,数组定义时若没有被初始化,则所有元素都没有值(或有不确定值);而一旦前面若干元素在定义时获得值,则其后所有元素都有默认值0。
】
2、数组元素在定义之后获得值
(1)获得有规律的值
一般情况,各元素值与其下标有函数关系。
例如:
让数组元素获得从2开始的连续偶数。
inta[10],k;
for(k=0;k<=9;k++)
a[k]=2*(k+1);
通常使用循环语句,循环体为赋值语句。
(2)获得无规律的值
通常使用循环语句,循环体为scanf函数语句。
for(k=0;k<10;k++)
scanf(“%d”,&a[k]);
3、数组元素的输出
(1)所有元素都被输出,用循环
for(k=0;k<10;k++)
printf(“%5d”,a[k]);
(2)输出部分元素
三、一维数组的常用算法
1、求最大值、最小值算法
例1.任意读入10个整数,输出其中的最大数。
#defineN10
main()
{inta[N],k,max;
for(k=0;kmax=a[0];
/*总是将第一个或最后一个元素认为就是最大的*/
for(k=1;kif(a[k]>max)max=a[k];
printf(“MAX=%d\n”,max);
}
2、递推(猴子吃桃)
【输出时,以前只能从第9天……输出到第1天;如今可以随意任意一天的桃子数。
】
main()
{inta[11],k;/*想让a[1]存放第一天的桃子数,……a[10]存放第10天的桃子数。
a[0]浪费了*/
a[10]=1;
for(k=9;k>=1;k--)
a[k]=2*(a[k+1]+1);
for(k=1;k<=10;k++)
printf(“%d:
%d\n”,k,a[k]);
}
3、查找
(1)顺序查找(线性查找)
例1.任意读入10个整数,看看其中是否有数值99,若有,输出是第一个读入的;否则,输出“wu”。
【算法要领:
拿关键值与每一个元素进行比较,一旦找到即跳出循环……】
本题忽略了有相同值的情况,即找到第一个相等值就终止。
main()
{inta[10],k
for(k=0;k<10;k++)
scanf(“%d”,&a[k]);
/*以下用循环查找*/
for(k=0;k<10;k++)
if(a[k]==99)break;
if(a[k]==99)/*k<10或k!
=10*/
printf(“%d\n”,k+1);
else
printf(“wu\n”);
}
/*用while改写*/
main()
{inta[10],k
for(k=0;k<10;k++)
scanf(“%d”,&a[k]);
k=0;/*查找应该在指定范围内!
*/
while(k<10&&a[k]!
=99)k++;
/*范围控制在前*/
if(a[k]==99)/*k<10或k!
=10*/
printf(“%d\n”,k+1);
else
printf(“wu\n”);
}
(2)折半查找(二分法)
【算法要领:
待查找范围内的数据事先必须有序,计算出整个查找区间的中点,将对应的数组元素与关键值比对,一旦相等,则找到,出循环;否则,数据若升序排列,关键值大于对应中间元素,修改low值;关键值小于对应中间元素,修改high值。
当low>high时,表示找不到。
】
例如:
已有10个按升序排列的数据,任意读入一个数,看10个有序数中有无与之相等的数。
main()
{inta[10]={-90,-79,-68,-57,-44,-32,-29,-10,-9,-5};
intk,low=0,high=9,mid;
intx;
scanf("%d",&x);
mid=(low+high)/2;
while(a[mid]!
=x&&low<=high)
{if(x>a[mid])low=mid+1;
if(xmid=(low+high)/2;
}
if(a[mid]==x)/*low<=high*/
printf("Found\n");
else
printf("Notfound\n");
}
4、排序
(1)冒泡排序(起泡)
【算法要领:
n个数最多处理n-1趟,每一趟比前一趟少比较一次。
每趟中从头到尾(或从尾到头)两两相邻的元素进行比较,升序时,前者大后者小则交换……】
例如:
任意读入10个整数,升序排列后输出。
#defineN10
main()
{inta[N],k,t,n;
for(k=0;kscanf(“%d”,&a[k]);
/* 外循环控制趟数*/
for(n=1;n<=N-1;n++)
/*内循环控制每趟的比较次数*/
for(k=0;k<=N-1-n;k++)/*比前少1*/
if(a[k]>a[k+1])/*注意不让a[k+1]越界*/
{t=a[k];a[k]=a[k+1];a[k+1]=t;}
for(k=0;kprintf(“%6d”,a[k]);
}
(2)选择法排序
【算法要领:
n个数最多处理n-1趟,第一趟,找出最小数(升序排列)与第一个元素交换值;第二趟,找出除第一个元素以外的最小数(升序排列)与第二个元素交换值;……】