c语言第五章 数组算法总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]*/

{ for(j=i+1;j<5;j++) /*内层循环控制每趟比较的次数,定a[i]时都是从a[i+1]一直比到 if(a[j]

for(i=0;i<5;i++) printf("%5d",a[i]); }

5. 冒泡排序的算法:冒泡排序也是对数组中的n 个元素进行排序,既然也是排

序,那么肯定也是一个一个数来定的,也就是n 个数同样需要定n-1趟,剩下最后一个数的时候就不用定了,只是冒泡排序与前面说的选择排序算法所不同的是它每趟定一个数的时候思路不同,它的思想是将数组中的元素两两进行比较,比如有n 个数,则将a[0]----a[1]比,把大的调到后面,再将a[1]—a[2]比,大的调到后面,a[2]---a[3],……一直比到最后一个a[n-2]—a[n-1]进行比较,这样比完一趟后就能确保n 个数当中最大的就会沉底,最大的一个肯定会在最后一个数中即a[n-1]中,具体的比较动画看课件第18页PPT ,这样定下一个最大的之后再按同样的思路来定次大的……具体比较思路看下图以五个数的数组元素为例:所以冒泡排序的顺序是先定a[4]放最大的数,然后定a[3]放次大的数……一直定到倒数第二个即a[1]为止,剩下最后一个数就不用定了,所以也是n 个数需要n-1趟,每一趟定下

第一趟 定a[0]

a[0]---a[1] a[0]---a[2] …………

a[0]---a[n-1]

第二趟 定a[1]

a[1]---a[2] a[1]---a[3] …………

a[1]---a[n-1]

第三趟 定a[2]

a[2]----a[3] a[2]----a[4] ………… a[1]---a[n-1]

第i 趟 定a[i]

a[i]---a[i+1] a[i]---a[i+2] ………… a[i]---a[n-1]

相关文档
最新文档