《啊哈!算法》笔记

第 1 章 排序 
 桶排序 
 冒泡排序 
 快速排序  
 
第 2 章 栈、队列、链表  

 队列  
 栈  
 链表  

  模拟链表  


第 3 章 枚举!很暴力  

 奥数

 数的全排列 


第 4 章 万能的搜索  

深度优先搜索 
广度优先搜索

第 5 章 图的遍历

深度和广度优先

图的深度优先遍历 

图的广度优先遍历 

第 6 章 最短路径  
第 1节 只有五行的算法——Floyd-Warshall  
第 2节 Dijkstra算法——通过边实现松弛  
第 3节 Bellman-Ford——解决负权边  
第 4节 Bellman-Ford的队列优化  
第 5节 最短路径算法对比分析

第 7 章 神奇的树

二叉树

并查集  

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

1.1桶排序---O(N+M)

1.2冒泡排序---O(N^2)

  核心:双重嵌套循环

1.3快速排序(二分法)---O(NlogN)

  1)找基准数    

  2)先从右往左找到一个小于6的数,再从左往右找一个大于6的数,交换

1.4 去重、排序

  第一种方法:桶排序、

  第二种方法:先排序、后去重,冒泡排序或者快速排序

2.1 队列

  线性结构,只允许在队列的首部 head 进行删除,在队列的尾部 tail 插入

  例子:买票;先进先出 FIFO

  结构体类型:

struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};

2.2 栈

  例子:小桶放球;后进先出

  top:指向栈顶的变量

  用途:判断回文词,

2.4 链表

  C语言中,可以使用 指针和函数malloc来实现。 

  也可以用数组模拟链表

    结构体 node,两个成员,data和指针

struct node *head;
head = NULL;//头指针为空

struct node *p;
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p = (struct node *)malloc(sizeof(struct node));

scanf("%d",&a);
p->data = a;//将数据存储到当前结点的data域中
p->next = NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空

    ->叫做结构体指针运算符,也是用来访问结构体内部成员的。因为此处p是一个指针,所以不能使用.号访问内部成员。

2.5 模拟链表

  用数组模拟链表

  两个数组,data 和 left

3.1 枚举

3.2 炸弹人

  使用数组模拟地图

3.3 火柴棍模式

  核心是 求方程的解,

3.4 数的全排列

4.1 深度优先搜索 (Depth First Search, DFS)

  基本模型

void dfs(int step)
{
    //判断边界
    //尝试每一种可能 
    for(i=1;i<=n;i++)
    {
            继续下一步 dfs(step+1);
    }
    返回
}

 数字全排列

4.2 迷宫问题

4.3 广度优先搜索(宽度优先搜索)Breadth First Search, BFS

  层层递增

4.4 炸弹人 用 dps、bfs 解

4.5 宝岛探险

4.5 水管工游戏

  

五、图的遍历

5.1 深度和广度优先

   图的邻接矩阵法

5.2 图的深度优先遍历

  

六、最短路径

  6.1 Floyd-Warshall,

  6.2 Dijikstra 算法——通过边实现松弛

    曲线救国

  6.3 Bellman-Fod——解决负权边

for(k=1;k<=n-1;k++)
    for(i=1;i<=m;i++)
        if(dis[v[i]] > dis[u[i]] + w[i])
            dis[v[i]] = dis[u[i]] + w[i];

  6.4 Bellman-Ford 的队列优化

  

  6.5 最短路径算法对比分析

七、树

7.1 树

  树:不包含回路

  图:包含回路

  树的特点:1,树中的任意两个结点有且只有一条路径联通。2,n个结点则有n条边。3,在一棵树中加一条边将会构成一个回路。

7.2 二叉树

  完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

  满二叉树的任意节点,要么度为0,要么度为2.

7.3 堆

  一种特殊的二叉树

  最小堆:所有父节点都比子节点要小

  最大堆:所有父节点都比子节点要大

  应用:

  

  优先队列:支持插入元素和寻找最大(小)值元素的数据结构

7.4 并查集

  

  

原文地址:https://www.cnblogs.com/IDRI/p/5750312.html