7-10 简化的插入排序
1.实验代码
#include <stdio.h> int main () { const int N=10; int n,i,j,m,a[N]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } scanf("%d",&m); if(n==0) { printf("%d ",m); }else if(n==1) { if(m>a[0]) printf("%d %d ",a[0],m); else printf("%d %d ",m,a[0]); }else { if(a[n-1]<m) { for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("%d ",m); } for(i=0;i<n;i++) { if((a[i]<m)&&(m<a[i+1])) { j=i; for(i=0;i<=j;i++) { printf("%d ",a[i]); } printf("%d ",m); for(i=j+1;i<n;i++) { printf("%d ",a[i]); } } } if(a[0]>m) { printf("%d ",m); for(i=0;i<n;i++) { printf("%d ",a[i]); } } } }
2 设计思路
(1)主要描述题目算法
a.先定义N=10,再定义数组a[N],输入一个整数n,i,i=0,在循环结构中对a[i]进行赋值,输入要插进去的数m。
b.根据输入n的值情况的不同进行讨论;及当m插入开头,中间,结尾进行分类。
c.最后输出排列过顺序的值。
(2)流程图
3.本题调试过程碰到问题及解决办法
遇到的问题是情况考虑的不全面,关于n=0时的情况;关于n=1时的情况;关于插入的值m在最前面及最后面的情况,这些一开始自己都没有写在程序中,后针对对测试点,完善代码。
7-1 求整数序列中出现次数最多的数
1.实验代码
#include <stdio.h>
int main ()
{
const int N=1000;
int number[N],i,n,j,count[N],max,m;
max=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&number[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(number[i]==number[j])
count[i]=count[i]+1;
}
}
for(i=0;i<n;i++)
{
if(count[i]>max)
{
max=count[i];
m=i;
}
}
printf("%d %d",number[m],max);
return 0;
}
2 设计思路
(1)主要描述题目算法
a.对 number[N],i,n,j,count[N],max,m进行整型定义,N=1000,输入n,在循环结构中输入number[i]。
b.将number[i]数组中相同的数出现的次数与count[i]对应起来。
c.比较count[i]的最大值,并输出对应的number[m]。
(2)流程图
3.本题调试过程碰到问题及解决办法
一直错误在max在统计中多次更新,错误在for关于if(number[i]==number[j])双重循环中,一开始自己写的循环为for(i=0;i<n;i++);for(j=i;j<n-i;j++)这样的话,会使得之后的number[i]值不能和之前的number[j]值进行比较,会导致最后max的错误,甚至是结果的错误。
7-4 数组元素循环右移问题
1.实验代码
#include <stdio.h> int main () { const int N=100; int number[N],m,n,i,tmp; scanf("%d %d",&n,&m); for(i=0;i<n;i++) { scanf("%d",&number[i]); } if(n>=m) { m=m; }else { m=m%n; } for(i=n-m;i<n;i++) { printf("%d ",number[i]); } for(i=0;i<n-m;i++) { printf("%d",number[i]); if(i<n-m-1) { printf(" "); } } }
2 设计思路
(1)主要描述题目算法
a.对number[N],m,n,i,tmp进行整型定义,输入n,m,在for循环语句中输入number[i]。
b.判断第二行输入的n个整数与m的关系,根据不同的关系,将原本的数组顺序相应的向右移动m位。
c.最后输出移动过后的数组number[n]。
(2)流程图
3.本题调试过程碰到问题及解决办法
遇到的问题为没有考虑到当输入向右移的m位值大于输入的n个数,及当m为n的倍数时的情况,后来经过一步步的调试及对过程的了解后将情况补全。
7-3 选择法排序
1.实验代码
#include <stdio.h> int main () { int a,i,j,min,tmp,number[10]; scanf("%d",&a); for(i=0;i<a;i++) { scanf("%d",&number[i]); } for(i=0;i<a-1;i++) { for(j=0;j<a-i-1;j++) { if(number[j]<number[j+1]) { tmp=number[j+1]; number[j+1]=number[j]; number[j]=tmp; } } }for(j=0;j<a;j++) { if(j+1==a) printf("%d",number[j]); else printf("%d ",number[j]); } }
2 设计思路
(1)主要描述题目算法
a.对a,i,j,min,tmp,number[10]进行整型定义,输入a,在for的循环语句中输入number[i]的值。
b.在for的双重循环中对number[j]和number[j+1]进行比较,如果number[j]<number[j+1],则将number[j]与number[j+1]进行交换。
c.在for循环语句中输出排好顺序后的数组number[j]。
(2)流程图
3.本题调试过程碰到问题及解决办法
遇到的问题在于没有弄懂它的比较交换的思路,一直将for双重循环的内循环条件弄错,应为j<a-i-1,而自己一直写成j<a-i,在上完课并重新理解过流程后,最终改正。
我的git地址:https://git.coding.net/exo07/disizhouzuoye.git
个人总结
在本周我学习关于一维数组,二维数组,还看了一些关于函数的书籍,学到了很多,特别是关于冒泡排序法,选择排序法,虽然对我来说难度不小,但自己已经大致了解了思路;不足的为考虑关于这方面问题时,自己会考虑的不全面,比如在按照顺序插入一个数时,自己只考虑到插到中间的情况。