2.3.3主要算法说明 1.选择法的基本思想
选择法的基本思想是:先将第一个元素作为最小者,与后面元素比较,如第一个元素大,则与其交换(保证第一个元素总是最小的),直到与最后一个元素比较晚,第一趟就找出了最小元素,且保存在第一个元素位置。再以第二个元素作为最小者(次小)与后面元素比较,若后面元素下,则交换,直到最后一个元素,第二小的元素已找到。依此类推。经过n-1趟后排定。 2.选择法的改良思想
事实上,只要记住比较时小元素的位置,即下标,在内循环结束后做一次交换即可,从而提高程序执行的效率。 3.具体函数的解析
本程序仅使用了主函数main()
(1)用第一个循环for(a=0;a<=n-1;a++);scanf(\来实现获取要排序的数字的总个数; (2)用两重循环来实现排序。
外层循环for(a=0;a<=n-1;a++) 控制排序的趟次,若数组有n个元素,则共进行n-1趟。
(3)内层循环 for(b=a+1;b<=n-1;b++)完成,在剩余的数中选择最小的数 ,比较次数随趟数递减,循环控制变量b的初值与外循环执行次数有关:b=a+1,终值为n。当后面元素较大时,马上交换。
(4) 用for(a=0;a<=n-1;a++);printf(\)输入排序后的元素。 4.改良程序比原来的程序执行效率高的原因的分析
经过对测试结果(详情见下章运行结果)分析,第二个改良的程序效率明显比原来的程序高效得多,第二个程序中与第一个程序的不同点如下: for(a=0;a { k=a; /*k始终存放本趟最小元素的下标,开始时为i*/ for(b=a+1;b<=n-1;b++) 1 6 if(x[k]>x[b]) k=b; /*记住新的小元素的序号,在内循环结束后才和最后一个数实现交换*/ if(k!=a) { t=x[a]; /*若k不等于i,说明a[i]不是最小的数,需要交换*/ x[a]=x[k]; x[k]=t; } 变量K记住比较时小元素的位置,即下标,在内循环结束后做一次交换即可,从而提高程序执行的效率。 2.4 统计各字母出现的频率 2.4.1设计目标 统计字符出现的频率:二维字符数组中保存了很多字母,运行程序,计算各个字母出现的频率(频率=出现的次数/总字母数),并将频率显示出来。 2.4.2数据结构设计 本程序主要使用数据类型为数组类型和整型类型,具体如下: 存放一系列随机字母的字符型二维数组 int s[10][10]; 存放的所有字母的总个数 浮点型 float n; 循环所用的变量 整型 int i,j; 表示26个大写字母的各个次数的数组 整型 int da[26]; 表示26个小写字母的各个次数的数组 整型 int xiao[26]; 2.4.3主要算法说明 (1)gets(s[0]); 调用gets()函数计算获取字母; (2) n=strlen(s[0]); 调用strlen函数,计算整个二维数组的字母总个数; (3) 用外循环for(i=0;i<10;i++) 内循环 for(j=0;j<10;j++) 对输入的一系列字母进行扫描 如果 if(s[i][j]>='A'&&s[i][j]<='Z') 判断是否为大写字母 对应的大写字母的次数自加一次 da[s[i][j]-'A']++; 如果else if(s[i][j]>='a'&&s[i][j]<='z') 判断是否为小写字母 1 7 对应的小写字母的次数自加一次 xiao[s[i][j]-'a']++; (4)最后再用一个for循环输出运行结果 for(k=0;k<26;k++) { if(da[k]!=0) printf(\的个数为:%d\\n 出现频率为:%f \\n\ //k+'A'为大写字母,da[k]为此字母的个数;n为总字母数 if(xiao[k]!=0) printf(\的个数为:%d\\n 出现频率为:%f \\n\ //k+'a'为小写字母,xiao[k]为此字母的个数;n为总字母数 } 2.5实现一个程序的多次调试 最简单的算法说明: 在主函数中增加如下一部分,可实现这样的功能: 运行程序时,若输入任意键,则程序开始正式进行;并且可以输入多组数据进行调试,最后按Ctrl+Z(记得加回车)可以结束程序。 char x; 1 8 printf(\请输入任意键开始程序,若输入Ctrl+Z则结束程序\\n\while(scanf(\{ /*所要运行的步骤的内容*/}; 第三章 运行结果 3.1 汉诺塔程序运行情况 1 9

