暂时引用Github项目:https://hub.fastgit.xyz/dunwu/algorithm-tutorial
在线阅读:
http://turnon.gitee.io/algorithm-tutorial/#/
https://dunwu.github.io/algorithm-tutorial/#/
数据结构:
1.数据与数据之间的关系:集合,一对一,一对多,多对多
2.数据的存储结构:
线性表(一对一)-->顺序表(数组),链表,栈(先进后出),队列(先进先出)
树形结构(一对多) -->二叉树
图形结构(多对多)
算法性能分析
- 时间复杂度
评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。
- 空间复杂度
复杂度级别:
- $$O(1)$$:常数
- $$O(log n)$$:对数
- $$O(n)$$:线性
- $$O(n^2)$$:平方
- $$O(n^3)$$:立方
- $$O(2^n)$$:指数
- $$O(n!)$$:阶乘
// 从小到大排序 arr[]数组
3 2 5 4 3 6
0 1 2 3 4 5
1.选择排序算法
写一个两层循环,i从0开始,比较arr[0]和后面的数,如果arr[0]比arr[1]小,则不变;如果arr[0]比arr[1]大,则交换arr[0]和arr[1],且设置最小值为这个arr[1],同理,这样循环比较完arr[0]的值就是我们设置的最小值,同样的,再去比较arr[1]和后面的数,最后得到arr[1]赋值为最小值
2.冒泡排序算法
比较arr[0]和arr[1],如果arr[0]大于arr[1],则交换arr[0]和arr[1]顺序,同理再去比较arr[1]和arr[2],如果arr[1]大于arr[2],则交换arr[1]和arr[2]顺序...这样从0~N-1,再从0~N-2...
异或运算xor,相同为0,不同为1(以后我讲异或免杀)
- 1 ^ N = N,N ^ N = 0
- 交换律和结合律
当我们要交换a和b的值时,可以用这样的方法
a = a ^ b; # a = 甲 ^ 乙 b = 乙
b = a ^ b; # a = 甲 ^ 乙 b = 甲 ^ 乙 ^ 乙 => b = 甲
a = a ^ b; # a = 甲 ^ 乙 ^ 甲 => a = 乙 b = 甲
# 切记,这里a不能等于b位置,否则会被抹成0