【1】算法简介
1.1
排序的重要问题:
1、排序项数
2、已经排序的程度、
3、项值的可能限制
4、计算机体系结构
5、储存设备的种类
1.2
衡量算法的主要标准:时间 & 空间
【2】算法入门
2.1 插入排序
循环不变式:前i个总是排好顺序的。增量法
插入排序python代码
def insertSorted(xList):
n = len(xList)
for sortIdx in range(1, n):
cache = xList[sortIdx]
idx = sortIdx - 1
while idx >= 0 and xList[idx] > cache:
xList[idx+1] = xList[idx]
idx -= 1
xList[idx+1] = cache
return xList
if __name__ == '__main__':
print insertSorted([1, ])
print insertSorted([2, 1])
print insertSorted([2, 2, 1])
print insertSorted([2, 3, 4, 1])
print insertSorted([1, 2, 4, 3])
randomList = range(10)
random.shuffle(randomList)
print 'random:', randomList
print insertSorted(randomList)
2.2 算法简单分析
在分析算法之前,要建立实现技术的模型:单处理器,随机存取机(RAM): 无法并行,不包含层次存储。
算法的有效性:通常是时间
常见的常数时间指令:算术指令(加减乘除、取余、向上下取整),数据移动指令(装入、储存、复制),控制指令(转移,子程序调用与返回),2^k
插入排序的平均情况O(n^2),
2.3 另外的算法设计方法
分治法:递归解决问题

D(n)为分解问题需要的时间
C(n)是子问题合成为原问题的时间
对于本问题,每一层代价都是cn,总共有lg(n)层
合并排序Python代码
def merge(originList, start, mid, end):
xList = originList[start:mid] + [np.inf]
yList = originList[mid:end] + [np.inf]
zList = []
idxX, idxY = 0, 0
for i in range(len(xList + yList) - 2):
x, y = xList[idxX], yList[idxY]
if x < y:
zList.append(x)
idxX += 1
else:
zList.append(y)
idxY += 1
originList[start:end] = zList
return originList
def mergeSort(xList, start=0, end=None):
if end is None:
end = len(xList)
if start < end - 1:
mid = int((start + end) / 2.)
mergeSort(xList, start, mid)
mergeSort(xList, mid, end)
xList = merge(xList, start, mid, end)
return xList
if __name__ == '__main__':
print mergeSort([1, ])
print mergeSort([2, 1])
print mergeSort([2, 2, 1])
print mergeSort([2, 3, 4, 1])
print mergeSort([1, 2, 4, 3])
randomList = range(10)
random.shuffle(randomList)
print 'random:', randomList
print mergeSort(randomList)