广度优先和深度优先遍历

不看就不记得的广度深度优先遍历!

深度优先遍历

(类似于树的先序遍历)

1
2
3
4
5
6
7
8
9
10
11
12

伪代码:

void DFS(vertex V)

{
visited[v] = true;
for (v 的每一个邻接点 w )
if(visted[w] == false) //没有被访问过
DFS(w)

}

广度优先遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

伪代码:

void BFS(vertex V)

{
visited[v] = true;
enqueue(v,Q) //将该点加入队列
while(Q is not empty) //只要队列不空
{
v = dequeue(Q) //从队列中取出一个
for(v 的每一个邻接点 w)
if(visited[w] == false) //没有被访问
enqueue(w,Q) //将该点加入队列
visited[w] = true; //设置访问标志

}

}

无权图的单源最短路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Unweighted ( Vertex S ) 
{
Enqueue(S, Q);
while(!IsEmpty(Q))
{
V = Dequeue(Q);
for ( V 的每个邻接点 W )
if ( dist[W] == -1 )
{
dist[W] = dist[V]+1; //s到w 的最短路径
path[W] = V; //s到w 的最短路径所经过的点 v
Enqueue(W, Q);
}
}
}

有权图的单源最短路径

Dijkstra算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dijkstra(Vertex v)
{
while(1)
{
v = 未收录顶点中dist最小的;
if(不存在这样的v,也就是所有的点都收录了)
break;
collected[V] = true;
for(v 每一个邻接点 w)
{
if(collected[w] == false)
{
if(dist[v]+e<v,w> < dist[w]) //小则更新
dist[w] = dist[v] + e<v,w>
path[w] = V
}
}

}
}

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void bubble_sort(A[],n)

{
for(int i=n-1;i>=0;i--)
{
int flag = 0;
for(int j=0;j<i;j++) //一趟冒泡排序
{
if(A[i] > A[i+1])
{
swap(A[i],A[i+1])
flag = 1 //标志发生了交换
}
}
if(flag == 0 )
break //全程都没有交换,证明序列已经有序
}
}

插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void insert_sort(A[],n)

{
for(int i=1;i<n;i++)
{
tmp = A[i]
for(int j=i;j>0;j--)
{
if(A[i] < A[j])
{
A[i] = A[i-1]
}
else
break
}
A[i] = tmp
}

}