算法学习之减治法
文章目录
减治法的基本思想
- 将规模为n的问题递减为规模为n-1或n/2的子问题,反复递减后对子问题分别求解,再建立子问题的解与原问题的解的关系。
- 减治法有三个变形:
- 减常数(如1) :每此迭代规模减小n→n-1
- 减因子(如1/2):每此迭代规模减半n→ n/2
- 减可变规模:每此迭代减小的规模不同
插入排序
- 插入排序的过程类似玩牌时整理手中纸牌的过程。它的基本思想是:每步将一个待排序的对象按照其关键字的大小,插到前面已经排好序的序列中的适当位置,直到全部对象插入完毕为止。
- 常用的插入排序有:直接插入排序、折半插入排序、链表插入排序和希尔排序,它们划分的依据是在排好序的序列中寻找插入位置所使用方法的不同。
直接插入排序举例
待排序序列{89,45,68,90,29,34,17}
插入过程:
{89} 不需比较
{45,89}
{45,68,89}
{45,68, 89,90}
{29,45,68, 89,90}
{29,34,45,68 89, 90}
{17,29,34,45,68, 89, 90}
插入次数=n-1=6
直接插入排序伪代码
ALGORITHM InsertionSort( A[0..n-1] )
// 对给定序列进行直接插入排序
// 输入:大小为n的无序序列A
// 输出:按非递减排列的序列A
for i ← 1 to n-1 do
v ← A[i]
j ← i-1
while j ≥ 0 and A[j] > v do
A[j+1] ← A[j]
j ← j –1
A[j+1] ←v
直接插入排序效率分析
基本操作: 比较
比较次数C(n):
最坏的情形,每次插入需比较已插入的所有元素,此时,第i次插入比较i个元素,故
深度优先
可以从任何顶点开始访问图的顶点,每次迭代时,处理与当前顶点相邻的未访问顶点。
用栈来跟踪深度优先查找的操作最方便。
DFS的伪代码
Pseudocode for Depth-first-search of graph G=(V,E):
DFS(G)
count :=0
未访问的顶点标记为 0
for each vertex v∈ V do
if v 的标记为 0
dfs