第1章 算法基础
1.1 插入排序
-
关键词:我们要排序的数。
-
伪代码:我们使用最清晰,最简洁的表示方法来说明给定的算法。
- 约定:
- 缩进表示块结构
- while,for与repeat-until等循环结构以及if-else等条件结构与代码类似
- //:表示该行后面部分是个注释
- i=j=e:将e的值赋给变量i和j
- 数组元素通过“数组名[下标]”的形式来访问
- 复合数据通常被组织成对象,对象又由属性组成
- 我们按值把参数传递给过程
- 约定:
-
INSERTION-SORT:插入排序的伪代码过程。
for j = 2 to A.length key = A[j] //Insert A[j] into the sorted sequence A[1..j-1]. i = j - 1 while i > 0 and A[i] > key A[i+1] = A[i] i = i - 1 A[i+1] = key
A[1…n]:包含长度为n的要排序的一个序列。
A.length:A中元素的数目n
-
循环不变式:
- 性质:
- 初始化:循环之前它为真
- 保持:下次迭代依然为真
- 终止:循环终止时,不变式为我们提供有用的性质
- 性质:
-
python代码:
def insert_sort(mylist): length = len(mylist) #获取列表长度 for i in range(1,length): j = i - 1 #设置当前值前一个元素的标识 if(mylist[i] < mylist[j]): #如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位 temp = mylist[i] mylist[i] = mylist[j] j = j-1 #继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素 while j>=0 and mylist[j] > temp: mylist[j+1] = mylist[j] j = j-1 mylist[j+1] = temp #将临时变量赋值给合适位置 return mylist mylist = [49,38,65,97,76,13,27,49] print(insert_sort(mylist))
1.2 分析算法
-
输入规模:概念:输入规模的最佳概念依赖于研究的问题。
问题 量度 排序,计算离散傅里叶变换 输入中的项数 两个整数相乘 用二进制记号表示输入所需的总位数 输入是一个图 该图的顶点数和边数 -
运行时间:是指执行的基本操作数或步数
-
增长量级: θ ( n 2 ) \theta(n^2) θ(n2)
-
插入排序的最坏情况运行时间: T ( n ) = θ ( n 2 ) T(n)=\theta(n^2) T(n)=θ(n2)
1.3 设计算法
1.3.1 分治法
- 思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,再合并这些子问题的解来建立原问题的解。
- 步骤:分解,解决,合并