打算入算法的坑,今天才开始看算法导论这本书,刚好学完了Python基础,那其中的算法就用Python实现一遍,当做是巩固Python语法。
2.1 插入排序,概念不用说,大家都知道,就类似于左手一手扑克牌(已按顺序排列),右手要插一张牌进去,我们要比较右手和左手牌的大小,以保证正确插入。
伪代码如下式:
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
Python实现如下,从小到大:
def srt(arr):
for j in range(1,len(arr)):
if arr[j-1] > arr[j]:
key = arr[j]
i = j - 1
while i >= 0 and arr[i] > key:
arr[i+1] = arr[i]
i = i - 1
arr[i+1] = key
print arr
从大到小:
def srt(arr):
for j in range(1,len(arr)):
if arr[j-1] < arr[j]:
key = arr[j]
i = j - 1
while i >= 0 and arr[i] < key:
arr[i+1] = arr[i]
i = i - 1
arr[i+1] = key
print arr
这里要提一个循环不变式的三条性质:
1.初始化:循环的第一次迭代前,要为真。
2.保持:如果循环某次迭代之前为真,那下次迭代之前仍为真。
3.终止:终止循环时,不变式为我们提供一个有用的的性质,有助于证明算法正确性。
输入规模自然的量度是输入中的项数,我们可以计算算法每步的代价(时间)以及次数,由此可以计算算法运行的时间,同时引入增长率或增长量级概念,比如只考虑公式的
最高幂次项(an^2),可以记算法的最坏情况用(Theta n^幂次)。
2.3 设计算法
分治法思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地解决这些子问题,然后在合并这些子问题的解来建立原问题的解。步骤可分为:分解--解决--合并。