c语言第五章 数组算法总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章数组
数组的概念:一组相同类型数据的集合,数组中的所有元素都只能是同一个类型的,数组中的元素在内存中的空间是连续的,数组的定义、数组元素的引用和数组的初始化看书或者课件
容易错的地方:
◆数组的定义语句如:int a[10]是定义了10个整型元素的数组,表示一共有a[0]----a[9]10
个元素,切记Tc中元素的下标是从0开始,所以最后一个元素的下标是9而不是10!!!!!
◆只有定义语句Int a[10] 时,表示定义了一个数组,数组名为a,一共有10个元素,
其他任何地方出现a[i]都表示一个元素的引用!!!
(一)一维数组
主要算法:
1.数组元素的遍历:数组元素的输入输出,如果a数组中数组元素有n个,那
么数组元素的引用是从a[0]----a[n-1],我们的思想是通过一个变量i从0循环到n-1,那么a[i]就可以表示a[0]到a[n-1]一共n个元素了
main()
{ int a[10],i;
for(i=0;i<10;i++) /*变量i做下标,取值0~9,分别表示对第一个元素a[0]到最后一个scanf(“%d”,&a[i]);元素a[9]进行赋值*/
printf(“\n”);
for(i=0;i<10;i++)
printf(“%5d”,a[i]);/*从头到尾输出数组的每一个元素*/
printf(“\n”);
}
2.从一个数组中到处最大值和最小值:算法思想是用一个变量max表示存储
最大值,那么给max赋初值为a[0],即从第一个开始,假设第一个元素是当前最大的,然后遍历数组中的每一个元素,每一个元素都跟max进行比较,如果有比max大的则修改max的值,求最小值的思路跟最大值类似。
main()
{ int i,n;
float a[10],max,min;
printf(“input data numbers:”);
for(i=0;i<10;i++)
scanf(“%f”,&a[i]);
max=min=a[0]; /*设最大数和最小数都为a[0]*/
for(i=1;i<10;i++)
{ if(a[i]>max) max=a[i];
if(a[i] } printf(“\nmax=%f,min=%f\n”,max,min); } 3. 数组元素的逆序存放,int a[5]={15,6,7,8,19},比如数组中一共有五 个元素,要求对该数组进行逆序存放即变成数组的存储顺序为19,8,7,7,15,分析这个问题的算法,要实现逆序存放,即把第一个数跟最后一个数进行交换,第二个数跟第四个数进行交换即a[0]------a[4],a[1]----a[2]这两对进行交换,也就是5个数只需要交换2次,如果是6个数则需要交换3次,也就是如果是n个数只需要交换n/2次,每次进行交换的时候,a[0]与a[4],a[1]与a[3],发现其规律是a[i]与a[4-i]进行交换,也就是a[i]与a[n-1-i]进行交换,所以i是从0开始,一直到n/2-1为止。 main() { int i,t; int a[5]= {15,6,7,8,19}; for(i=0;i<2;i++) { t=a[i];a[i]=a[4-i];a[4-i]=t; } for(i=0;i<5;i++) printf(“%3d”,a[i]); } 4. 直接选择排序算法:如果有一个数组,int a[5]={5,2,6,1,4}, 最小的,a[1]中存放次小的…… 那么我们考虑要实现五个数的按顺序排序,步骤应该是一个一 个来的,也就是先考虑如何把五个数中最小的放到a[0],定下一 个最小的a[0]之后,再考虑把剩下四个数当中最小的放到a[1], 如此类推,那么五个数我们要定四趟,每一趟定一个数,从a[0] 定到a[3],那么最后当剩下一个数就不用再定了,那每一趟又是怎么定的呢?我们考虑要把五个数当中最小的放到a[0]中,那直接选择排序的算法思想是把a[0]跟后面的每一个数进行比较,也就是从a[1]一直比到a[4], 如果有比a[0]小的那么就进行交换,这样就可以确保比完后a[0]中存放的是五个数当中最小的了,这是第一趟的思路,以此类推,定完a[0]后,要把剩下的四个数当中最小的放在a[1]中,则是把a[1]跟后面的每个数相比,也就是从也就是从a[2]一直比到a[4],这样就可以定下第二小的数,以后的每个数一次类推…… 下图是对n个数进行排序时候的比较示意图,如果是n个数,那么需要定n-1趟,从a[0]一直定到a[n-2],第i趟是定下a[i],每趟要定a[i]的时候都是把a[i]与后面的的每一个数进行比较,也就是从a[i+1]到a[n-1],有比a[i]小的就进行交换,所以一共需要n-1趟,每趟又需要比较多次,用到双重循环,外层循环控 制比较的趟数,内层循环控制每一趟比较的次数。 main( ) { int a[5],i,j,k,t; for(i=0;i<5;i++) scanf("%d",&a[i]); for (i=0;i<4;i++) / *外层循环控制趟数,5个数需要4趟,第i 趟是定下a[i]*/