day1:
数据结构算法:
线性:数组 链表 双向链表 堆栈 队列 双向队列等
非线性:二叉树 图 等
算法:
查找 排序
数据结构:数据元素一级数据元素存储之间的关系结构
day2:
数组:
(1).一片连续的内存空间 不能是断开的
(2).因为是连续的内存空间 才可以使用下标来访问
所以访问效率高
(3).在数据前面插入和删除的效率都比较低(需要移动数据)
链表:
当前元素保存了后面元素的地址.
(1).内存是不连续的
(2).访问效率比较低
(3).在任何地方插入和删除的效率非常高 (只需要)
单项链表的节点:
节点元素
下一个节点的地址
day3:
树
二叉树: 任何一棵树可以有左右子树
struct Tnode{
T data;
struct Tnode left;
struct Tnode right;
}
搜索树 有序树 排序树
左子树所有的元素都大于或等于根节点的元素
右子树所有的元素都小于或等于根节点的元素
任意一个树的节点都可以当做一颗数
day4:
二叉树
满二叉树:
叶子节点全部在同一个高度 且除了叶子节点以外,所有的节点都有左右子节点
一颗高度为H的满二叉树,一共有 2^h-1;
完全二叉树:平衡二叉树,最后一层的叶子节点必须是从左到右
除了最后一层以外还是一个满二叉树。
平衡二叉树:从任意一个节点开始,他的左右子树的高度差不会超过一.
对于一颗完全二叉树,如果对所有节点从1开始进行一次编号,则第i个节点的左右子树节点为2i , 2i+1 如果从0开始编号,则左右子节点为2i+1,2i+2
定理:
1.对于一颗高度为h的数 最多有2^h-1个节点
2.对于节点数为n的二叉树,他至少有log2(n+1)高
3.对于第i层,有2^(i-1)个节点;
红黑树: 查找效率最高 硬盘存储方式都是红黑树
大栈堆: 要求任意一个根节点的值 都要大于(或等于) 左右子树的所有的值
小栈堆: 要求任意一个根节点的值 都要小于(或等于) 左右子树的所有的值
1.堆排序:
把数组看作是一个完全二叉树
把完全二叉树调整成大栈堆
2.冒泡:
每两个元素进行比较 把较大值放后面 较小值放前面
把数据中的元素
3.选择:
遍历数组 能够记录最大值的下标
把最大值和最小后一个交换
遍历第二遍 不包含最后一个 再次记录最大值
在与倒数第二个交换 逐次交换; 循环len-1次
4.鸡尾酒:
每次选择一个最小值和最大值 最大值放末尾 最小值放开始
5.直接插入:
每次向前面插入,插入到合适的位置,列入1->3 4->3,1 2->4,3,1 —4,3,2,1
使得前面为每次插入后都是有序的
6.折半插入:
相比直接插入减少了查找的次数
7.希尔
插入的一种 时间复杂度最好可达到O(n^1.3)
第一个突破o(n^2)的排序算法
相比于折半插入,减少了插入的次数,使得到达有序数组所需的时间减少了
8.归并:
合并两个有序的数组合并成一个有序的数组
通过递归方式不断拆分数组使得数组全部变成1个1个的单独的数据
对于单独的数据来说就是有序的 在两两合一变成有序的,直到合成为一个数组
9.快速:
通过算法不断确定一个数的位置当所有数的位置都确定了那么数组就有序了
10.计数(桶):
时间复杂度 n
适用于一个比较小的区间内数据密度比较大的情况;
11.基数 :
时间复杂度d(n+r)
1.找最大值
2.计算最大值是一个几位数
个位:
十个容器(队列)
v[0]---->>>v[9]
时间复杂度:
随着数据量n 的增大 算法所需的时间和n的增长速率之间的关系
0(n^2)
0(nlogn)
冒泡 选择 直接 二分插入 2^n
堆排序,希尔排序,归并,快速,nlogn
基数 0(d(n+r))
计数 0(n)
时间复杂度0log(n)>0(n)>0(nlogn)>o(n^2)
C语言中自带的排序函数:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
任意类型排序 升序降序看返回值正负
void *bsearch(const void *key, const void *base,size_t nmemb,
size_t size,int (*compar)(const void *, const void *));
二分查找 数列有序 也需要比较函数返回值 正负
衡量一个算法的好与坏:
1.时间复杂度:
冒泡 选择 直接 二分插入 2^n
堆排序,希尔排序,归并,快速,nlogn
基数 0(d(n+r))
计数 0(n)
2.空间复杂度:
随着数据量的增大,算法所需的额外内存空间和n的增长率之间的关系
归并n 计数n 基数n+r
排序的稳定性:
假设数列中有相等的元素arr[i]和arr[j]且i<j
如果经过某种算法排序之后,arr[i]元素所在的下标为n arr[j]所在下标为m
如果n依然<m那么该排序算法是稳定的否则是不稳定的
稳定的排序: 冒泡 选择 插入 计数 基数
不稳定的排序:快速 希尔 堆
任何一个算法:
1.至少有0个以上输入
2.至少有一个输出
3.有穷性
4.确定性
2243

被折叠的 条评论
为什么被折叠?



