算法导论学习1

打算入算法的坑,今天才开始看算法导论这本书,刚好学完了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 设计算法

   分治法思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地解决这些子问题,然后在合并这些子问题的解来建立原问题的解。步骤可分为:分解--解决--合并。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值