2.1-2:
for j = 2 to A.length:
key = A[j]
i = j - 1
while i > 0 and A[i] < A[j]:
A[i+1] = A[i]
i = i - 1
A[i+1] = A[j]
2.1-4:
2.2-2
for i = 1 to n-1:
minindex = i
minum = ∞
for j = i to n:
if A[i] <= minum:
minum = A[i]
minindex = i
A[i] <=> A[minindex]
循环不变式:
考虑插入排序的循环不变式:for 循环每次迭代开始时,子数组A[1…j-1]由原来在A[1…j-1]中的元素组成,但以按序排列
本题的循环不变式:对于每一个外层循环开始迭代时,A[1…i-1]都已经得到赋值,保存着最小的i-1个数,并且已经排好序;A[i]等于A[i…n]中的最小值。
只需求前n-1:
访问到第n个时,A[n]已经是A[n…n]中的最大值,不需要修改。
用θ记号给出选择排序的最好情况和最坏情况运行时间
最好:θ(n) 每一个位置都不需要更新
最坏:θ(n2)第i个位置,需要访问n-i次,一共有n-1个i
2.3-6
for j = 2 to n:
A[0] = A[j]
idx = j/2 # (1+j-1)/2
if A[idx] > A[j]: # 前半部分
while idx >= 0 and A[idx] > A[j]:
A[idx+1]
伪码写到一般,在发现不可以(为什么我一开始没思考呢。。。)
不可以:插入排序算法的时间复杂度(θ(n2))主要依赖于,查找下标时的元素比较,以及过程中进行的元素移动。如果使用二分查找,元素比较次数平均减少一半,而元素移动次数不变,因此时间复杂度仍然是θ(n2)。