15周学习笔记
补:
14周看了大话数据结构1,2,3章,了解了算法的定义,以及一些专业术语的定义。我觉得判断数据时间复杂度挺有趣的,结合和数学幂函数知识,将计算机运算次数定为x自变量,在程序中推出总次数与自变量x的关系,即推出了数学表达式,观察其上升趋势,不同的数学式子在x取不同取值范围时总次数是不同的,因而我们要根据题目推断出与之要求相适应的算法(即运用哪一个数学式子计算总次数最低),大o介包括了常数介o(1),平方阶o(n^2),对数阶(lgn),我觉得这些公式无所谓,只要能推出计算总次数的函数表达式,我们仿用这例出基本的式子,推出属于什么阶,从而了解时间复杂度。
第三章链表:我觉得链表与数组最大区别就是,链表能把离散数据能顺序排列出来,而数组则是早早在内存开辟一空间,让数据顺序存储。链表能很好的进行数据插入和删除工作,而数组这样的顺序存储结构适合不断读写数据,链式存储结构和顺序存储结构互补优缺点。
链表和指针联系在了一起,即在数组基础上有了节点(存放数据和下一个数据地址),因而即使分散,但内部依然连接在一起。在学链表的时候还学习了结构体,结构体和指针便能表示出了单链表。总体来说对链表的原理已经能够知道,但是并不会构建一个链表来实现实际问题解决,学习完结构体和指针后便能尝试进行构建链表了。
求解多个数的最小公倍数
思路:可以由最基本的公式 两个数的最小公倍数为其两个数相乘除以最大公约数得到,而再加一个数时再用两个数的最小公倍数与第三个数求得最小公倍数,在求解中运用到了辗转相除法求最大公约数,求最小公倍数的过程可用被调函数实现,在主调函数中循环调用,并且有一个自变量得存储被调函数所传回的最小公倍数,再用该值得到与下一个数的最小公倍数。
在这里插入代码片#include<stdio.h>//求多个数最大公倍数
int lzy(int x,int y)
{
int n,i,nu;
n=x*y;
while(x%y>0)
{
nu=x%y;
x=y;
y=nu;
}
return n/y;
}
void zpy(int a[],int n)
{
int i,sum;
sum=lzy(a[0],a[1]);
if(n>2)
{
for(i=2;i<=n-1;i++)
{
sum=lzy(a[i],sum);
}
}
printf("%d",sum);
}
int main()
{
int a[1000],i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
zpy(a,n);
return 0;
}
从这代码中我运用了两个自定义函数,zpy是计算多个数的最终最小公倍数,lzy是利用辗转相除法计算最大公约数,从而用两数之积除最大公约数返回到zpy中,如果只有两个数,则直接返回给主函数中,如果大于2个数,则用循环以此求最小公倍数,一与二求得的最小公倍数返回给sum,再用宿命与三求最小公倍传给sum,sum值以此累积起来,最后则返回主函数得出解。
快速排序:
快速排序的平均时间复杂度为nlog(n),最坏是平方阶,这个排序方法关键是最左和最右同时往里靠筛选比基准值小和大的数,当a[max]大于基准值时就往左移(max–),如果出现小于基准值的值则跳出循环将a[min]和a[max]互换位置,由zpy函数实现。a[min]同理。然后关键的几步代码是递归求互换位置后的数,即再次排序筛选出小于和大于基准值的值。直到不满足min<max条件时结束循环。
在这里插入代码片#include<stdio.h>
#define int long long
void zpy (int a[],int min,int max)
{
int temp;
temp=a[min];
a[min]=a[max];
a[max]=temp;
}
int lzy(int a[],int min,int max)
{
int point=a[min];
while(min<max)
{
while(min<max&&a[max]>=point)
{
max--;
}
zpy(a,min,max);
while(min<max&&a[min]<=point)
{
min++;
}
zpy(a,min,max);
}
return min;
}
void quiksort(int a[],int min,int max)
{
if(min<max)
{
int nu;
nu=lzy(a,min,max);
quiksort(a,min,nu-1);
quiksort(a,nu+1,max);
}
}
int num[1000000];
int main()
{
int N,i,j;
scanf("%lld",&N);
for(i=0;i<N;i++)
{
scanf("%lld",&num[i]);
}
quiksort(num,0,N-1);
for(i=0;i<N;i++)
{
printf("%lld ",num[i]);
}
return 0;
}
关键是quiksort这一定义函数难以理解,此是运用递归思想对每次分在基准值左右的值再次调用lzy函数排序,直到不满足if条件,则说明已经从小到大排序号了。