算法导论
在实验室待着,项目项目干不下去,觉得还是要脑子里有理论啊。
第一部分基础总结
第一部分简单介绍算法的表达方法 、一些算法设计策略 、以及算法分析中用到的许多基本思想。
- 第一章:对算法及其在现代计算机系统中的地位进行综述。
- 第二章:插入排序和归并排序,并粗略的分析了一下算法的运行时间。
- 第三章:给出了算法运行时间的准确定义以及很多的数学表示法。
- 第四章:深入的探究了分治法以及“主方法”这一个工具。
- 第五章:介绍了概率分析和随机化算法。
第一章
什么是算法?
算法(algorithm)就是任何良定义的计算过程,该过程取某个集合作为输入并产生某个集合作为输出。
个人理解:算法就是一些正确且精妙而且可被实现的逻辑思维过程。
第二章
插入排序
插入排序的运行逻辑是啥?
插入排序的代码实现?
插入排序运行时间复杂度?
归并排序
归并排序的运行逻辑?
归并排序的代码实现?
归并排序的时间复杂度?
//插入排序
void insertion_sort(int *arr,int num)
{
int i, t, j=1;
for(j;j<num;j++)
{
for(i=j;i>0;i--)
{
if(arr[i]>arr[i-1])
{
t = arr[i];
arr[i]=arr[i-1];
arr[i-1]=t;
}
}
}
}
//归并排序
void merge_sort(int *arr, int num)
{
int l , r;
l = 0;
r = num-1;
merge(l, r, arr);
}
void merge(int l, int r, int *arr)
{
int i = l, j = (r+l)/2 + 1,m = (r+l)/2,t=0;
printf("\ni%d\tr%d\tm%d\t\n", i,r,m);
if(l==r)
{
printf("\nover\n");
return;
}
int *temp = (int *)malloc(sizeof(int)*(r-l+1));
merge(l, m, arr);
merge(j, r, arr);
while(i<=m&&j<=r)
{
if(arr[i]>=arr[j])
{
temp[t]=arr[i];
t++;
i++;
}else{
temp[t] = arr[j];
t++;
j++;
}
}
if(i>m)
{
while(j<=r)
{
temp[t] = arr[j];
j++;
t++;
}
}else{
while(i<=m)
{
temp[t] = arr[i];
i++;
t++;
}
}
printf("\ntemp\n");//此处可以看到归并的过程
for(i=0;i<r-l+1;i++)
{
printf("%d\t",temp[i]);
}
printf("\ntempend\n");
for(i=l,t=0;i<=r;i++,t++)
{
arr[i] = temp[t];
}
free(temp);
}