第一章,第二章,第三章
第一章
二分查找和简单查找
简单查找就是顺序一个一个的查找。缺点是复杂度o(n)比较高,好处是无论什么的原始数据都可以利用。
二分查找,二分查找的前提必须是有序的不然就会失去意义,二分查找利用有序的特点,每次都可以去掉当前数组长度的一半,所以复杂度为o(log2(n))
代码:
#include<stdio.h> int search(int a[],int n,int x) //数组已经有序 x为查找值,n为数组个数,返回查找值的索引 不存在就返回-1 { int low=0; int high=n-1; int mid; while(low<=high) { mid=(low+high)/2; if(a[mid]>x) high=mid-1; else if(a[mid]<x) { low=mid+1; } else return mid; } return -1; } int main() { int a[]={1,2,3,4,5,6}; int x; while(scanf("%d",&x)) { int temp=search(a,6,x); if(temp!=-1) printf("%d\n",a[temp]); else printf("no fund\n"); } }
大o表示法
是一种算法分析常用的表示方法,更多的表示随着规模n的变大的增速。它指出了算法运行时间的增速。一般情况下也是这种算法最差情况下的复杂度。
第二章 选择排序
选择排序实质上就是固定了每个位置必须是(假设你想要递增的序列),最小,大一点,再大一点,最大。当你完成这样的序列也说明排列完成了。
想要实现这个你就需要去到后面挨个去判断,交换。
代码实现和测试
#include<stdio.h> int select_sort(int a[],int n) { int i,j; int min; int temp; if(n<=0) return 0; for(i=0;i<n-1;i++) { min=i; for(j=i+1;j<n;j++) { if(a[j]<a[min]) min=j; } temp=a[i]; a[i]=a[min]; a[min]=temp; } return 1; } int main() { int a[]={1,7,4,6,3,-2,2}; select_sort(a,sizeof(a)/sizeof(a[0])); int i; for(i=0;i<sizeof(a)/sizeof(a[0]);i++) printf("%d ",a[i]); return 0; }
第三章递归:
首先他介绍了一个盒子堆的例子实质上这俩个例子,第一个例子象征的是广度搜索(bfs),第二个例子象征的深度搜索(dfs)从而引出递归.
递归并没有性能的优势,反而可能性能更差,每次调用递归都需要从新定义局部变量。很多情况下循环更具备有点,但他有独一无二的优点
就是理解方便。有时候编码很容易。
基线条件和递归条件:
递归条件是指函数调用自己,而基线条件是指函数不在调用自己,从而避免形成无线循环。