在大一上学期,我学习了《C语言程序设计教程》一书,对C语言有了初步的了解与学习。因此我接下来汇报的算法都将用c语言实现。当然,这些算法比较容易理解应用。我将以此作为基础,在第二学期继续努力,学习更多算法。
一、冒泡法排序
(关于排序还有选择法,个人感觉比冒泡要更容易,就不单独列出了。)
冒泡排序需要重复地走访过要排序的元素列,依次挨个比较两个相邻的元素,将顺序错误的两个元素交换从而达到排序目的。
例:随机输入十个数,按从小到大排序后输出
int main()
{
int a[10];
int i,j,t;
printf("输入十个数:");
for(i=0;i<10;i++)
{scanf("%d",&a[i]);}
for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
{if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}}
printf("排序后:");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
二、递推法
递推法需要通过已知条件,利用特定关系得出中间推论,再由中间推论一步步得到结果。
例:猴子吃桃子问题。小猴有桃若干,每天吃掉现有数的一半多一个,到第7天要吃时只剩下一个了,问小猴从第一天到第七天,每天桃子多少个?
在这个问题中,已知条件为第7天的桃子数量为1个,因此可以设第n天的桃子为x,它是前一天的桃子数的一半少1个,则有前一天桃子数量为2(x+1)个,即题目中的特定关系。
#include<stdio.h>
#include<math.h>
int main()
{
int d,x;
d=7,x=1;
for(;d>=1;d--)
{printf("第%d天的桃子数为:%d\n",d,x);
x=(x+1)*2;
}
return 0;
}
三、穷举法
例:有36块砖,一共有36人可以搬。男人一次搬4块,女人一次搬3块,两个小孩只能搬一块砖,若要求一次全搬完,问需要男、女、小孩各若干。
全部搬完,如只有男人,则需要12名。则男人人数范围为0-12名,同理女性。
在这个问题中穷举法的过程便是将男人0-12名、女人0-12名的各种情况列举出来,小孩人数则是通过总人数-男女人数计算得出,直到满足“一次搬完”条件穷举结束。
#include<stdio.h>
int main()
{
int m,w,c;
for(m=0;m<=12;m++)
for(w=0;w<=12;w++)
{c=36-m-w;
if(m*4+w*3+c*0.5==36)
printf("需要男人:%d 名,女人:%d 名,小孩:%d 名 \n",m,w,c);
}
return 0;
}
四、递归法
同样以猴子吃桃为例:猴子摘了若干桃子,每天吃现有桃子数的一半多一个,第7天早上只剩下1个桃子,问猴子一共摘了多少个桃子?
分析题目,可以得到信息:
n=1时 ,f ( n ) = 1;
n<7时, f ( n )= 2 * ( f ( n + 1 ) + 1 )
#include <stdio.h>
int peach(int d)
{int x = 1;
if (d == 7){x = 1;}
else
{x = (2*(peach(d+1)+1));}
return x;
}
int main()
{
int d = 1,sum = 0;
sum = peach(d);
printf("%d\n", sum);
return 0;
}
以上为我在大一上学期学到的一些印象深刻的算法,这些算法让我能够较好完成专业课老师布置的作业,让我收获良多。但同时我也清楚的认识到自己目前的水平远远不够。因此我计划在第二学期学习更多专业知识,学习并实现更多算法。