算法导论课后习题(部分)

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)。

3-2

在这里插入图片描述

发布了45 篇原创文章 · 获赞 0 · 访问量 1000

猜你喜欢

转载自blog.csdn.net/jokerxsy/article/details/104478534