对很多计算机初学者来说,数据结构和算法是很头疼的一门课。为了让大家能更快的学会这些简单的算法,所以我用了半个晚上整理了一些常用的算法。
我曾经也经历过巨大的痛苦,但是随着我不断地学习思考,我发现,学习数据结构和算法是有一些方法的。
我的方法就是 8 个字:总结规律、化繁为简。
总结规律其实就是多看看这些方面的程序,然后总结出那些总是不变的地方,而这些不变的地方就是它的原理。
化繁为简其实就是去掉一段程序的输入和输出部分,以及那些不必要的东西,最后剩下算法中的数学公式或者是推导原理。
把握住这两个要点,不断地学习练习,再加记忆。我相信很快就可以掌握数据结构和算法。
由于现在已经24点了,关于上面两个要点的详细做法,等我有时间再更新。
//顺序查找算法
void ShunXuSelect(int a[], int x)
{
while(j<n && x!=a[j])
j++;
if(j<n)
printf("%d的位置为%d",a[j],j);
else
printf("未找到");
}
//二分查找算法
void ErFenSelect(int a[], int x)
{
int low,hig,mid;
while(low < hig)
{
mid = (low+hig)/2;
if(x<a[mid])
hig = mid-1;
else
low = mid+1;
if(x==a[low])
printf("%d的位置为%d",a[low],low);
else
printf("未找到");
}
}
//冒泡排序算法
void BubbleSort(int a[], int n)
{
for(i=1;i<n-1;i++)
{
for(j=1;j<n-i;j++)
{
if(a[j]>a[j+1])
{
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
for(i=0;i<n;i++)
printf("%d",a[i]);
}
//整数n的b进制展开式
void JinZhi(int n, int b)
{
int a[20];
int q,n,b; //n 为输入的整数
int k=0;
q=n;
while(q!=0) //不断地除以b,以便得到余数
{
a[k]=q%b; //数组a用于保存每次的余数
q=q/b; //取商
k++;
}
for(i=k-1;i>=0;i++) //逆序输出,得到b进制的展开式
{
printf("%d",a[i]);
}
}
//二进制数加法算法
void ErJinZhiJiaFa(int a[], int b[]) //两个数组保存的是二进制各位数字
{
int n;
int j;
for(j=0;j<n-1;j++)
{
d = (a[j]+b[j]+c)/2; //进位c的值
s[j] = a[j]+b[j]+c-2d; //加的和
c = d; //更新进位c
}
s[n-1] = c; //保存的是最高位的进位值
}
//找硬币贪婪算法
void TanLan(int worthy[], int money, int n) //硬币面值、总共钱数、硬币种类
{
int a[n]; //每种面值硬币的个数
for(i=0;i<money;i++)
{
a[i]=0; //开始时,每种面值的硬币个数均为0
while(money>=worthy[i])
{
a[i]=a[i]+1;
money = money-worthy[i];
}
printf("%d面值的硬币%d个",worthy[i],a[i]);
}
}
基本上都可以实现,有小部分的算法我没完全写完整,但是思想和步骤都是完整的,大家自己认真思考一下。
后期我还会加上其它算法。
并且会继续深入介绍算法编程的一些方法和步骤。
欢迎大家关注我的博客。