您的位置:首页 > 其它

《算法导论》学习笔记——第二章 算法基础

2019-01-06 16:51 78 查看

第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

归并排序的运行时间是   。  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: