《算法导论》学习笔记——第二章 算法基础
第2章 算法基础
2.1 插入排序
插入排序对于少量元素的排序,是一个有效的算法。插入排序的工作过程就像我们排序手中的扑克牌,每次从桌上拿走一张牌并放在手上正确的位置。
具体实现的思路为,输入的数据为一个数组,左边为排序好的,右边是待排序的。利用循环遍历每一个要排序的数,将待排的设为key,与左边排序好的数组进行比较大小,然后交换位置。直到全部排好顺序。
[code]//插入排序的伪代码 for j=2 to A.length key = A[j] i = j-1 while i>0 and A[i]>key A[i+1] = A[i] i = i-1 A[i+1] = key
对于上述的伪代码有一些约定:1.缩进表示块结构。2.return语句允许单一的return返回多个值。 3.布尔运算符 and 和 or 都是短路的,即先运算前一个,如果不符合,就不会运算第二个。
2.2 分析算法
分析算法的结果意味着预测算法需要的资源。通常我们想度量的是计算时间。一般来说,算法需要的时间与输入的规模同步增长,所以通常把一个程序的运行时间描述成其输入规模的函数。为此,需要更仔细的定义“运算时间”和“输入规模”。
在插入排序中,最好的情况是输入数组已经排好序,该最佳情况的运行时间为: ,是n的线性函数。而最坏的情况,是输入数组已反向排序,即按照递减序排好,时间为n的二次函数。
我们往往集中于只求最坏情况运行时间,即对规模为n的任何输入,算法的最长运行时间。此外,我们做出一种更简化的抽象,即我们真正感兴趣的运行时间的增长率或增长量级。所以只考虑公式中最重要的项,因为当n的值很大时,低阶项相对来说不太重要。因此记插入排序的运行时间为 。
2.3 设计算法
本节考查另一种称为“分治法”的设计方法。
许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。这些算法典型的遵循分治法的思想 。分治模式在每层递归时有三个步骤:分解原问题为若干子问题。解决这些子问题,递归地求解各子问题。然而,若子问题规模足够小,则直接求解。合并这些子问题的解。
归并排序就是这个思路,分解:分解待排序的n个元素的序列,成各具有n/2个元素的两个子序列。解决:使用归并排序递归地排序两个字序列。合并:合并两个已排序的子序列以产生已排序的序列。
[code]//归并排序的伪代码实现 MEGRE(A,p,q,r)——p,q,r是数组的下标 n1 = q-p+1 n2 = r-q let L[1…n1+1] and R[1…n2+1] be new arrays for i = 1 to n1 L[i] = A[p+i-1] for j = 1 to n2 R[j] = A[q+j] L[n1+1] = null R[n2+1] = null i = 1 j = 1 for k = p to r if L[i]<=R[j] A[k] = L[i] else A[k] = R[j] j = j+1
归并排序的运行时间是 。
- 算法导论第二章——算法基础
- 《算法导论》学习笔记—算法基础
- 算法导论(第三版)第二章 算法基础
- 算法导论第二章-算法基础-Cpp代码实现
- 算法导论笔记ch2_算法基础(插入排序、归并排序、设计算法)
- 算法导论(一): 算法基础
- 《算法导论(第3版)》读书笔记(一)算法基础
- Python程序设计与算法基础教程·第二章上机实践
- 算法导论_第二章_算法基础
- 《算法导论》笔记系列之第2章算法基础
- 算法导论(一)1、算法基础-简介
- 《算法导论》笔记:第2章 算法基础
- [置顶] 信息学奥赛一本通(C++版) 第二部分 基础算法 第二章 数据排序
- 第二章 算法效率分析基础 page 55 汉诺塔问题
- 第二章 算法效率分析基础 page 60 例题:斐波拉契数列
- 《算法导论》(第二章)算法入门
- 《算法导论》学习笔记:1.算法在计算中的应用
- 第二章 算法基础
- 机器学习基础 第二章 预测算法
- 算法导论 学习笔记 第二章 算法入门