扩展问题自己想的,还没有搜索有没有其它解法...
发现这节就是算法导论9.1嘛...
1. [代码]解法一,只会这种估计要被淘汰的... 跳至 [1] [2] [3] [4] [5] [全屏预览]
#--coding: utf8 --
def find_max_and_min(A):
min = max = A[0]
for i in range(1, len(A), 1):
# 解法一说看成两个独立的问题,分别求,总共比较2N次
# 其实为啥要把两次比较独立呢,如果大于max就不可能小于min了,这样总比较应该不到2N次
if A[i] > max:
max = A[i]
elif A[i] < min:
min = A[i]
return (min, max)
if __name__ == "__main__":
# A = [1]
# A = [1, 2]
A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
print(find_max_and_min(A)2. [代码]解法二,其实我觉得直接给解法三就好了.. 跳至 [1] [2] [3] [4] [5] [全屏预览]
#--coding: utf8 --
def find_max_and_min(A):
# N/2次比较
for i in range(1, len(A), 2):
if A[i] < A[i-1]: A[i], A[i-1] = A[i-1], A[i]
# print(A)
min = max = A[0]
# N/2次比较
for i in range(2, len(A), 2):
if A[i] < min: min = A[i]
# N/2次比较
for i in range(1, len(A), 2):
if A[i] > max: max = A[i]
return (min, max)
if __name__ == "__main__":
# A = [1]
# A = [1, 2]
A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
print(find_max_and_min(A)3. [代码]解法三,跟解法二差不多 跳至 [1] [2] [3] [4] [5] [全屏预览]
#--coding: utf8 --
def find_max_and_min3(A):
min = max = A[0]
for i in range(1, len(A), 2):
# N/2次比较
if A[i] > A[i-1]:
t_max = A[i], t_min = A[i-1]
else:
t_max = A[i-1], t_min = A[i]
# N/2次比较
if t_max > max: max = t_max
# N/2次比较
if t_min < min: min = t_min
return (min, max)4. [代码]解法四,分治方法 跳至 [1] [2] [3] [4] [5] [全屏预览]
#--coding: utf8 --
def find_max_and_min(A, p, r):
if r - p <= 1:
if A[p] < A[r]:
return (A[p], A[r])
else:
return (A[r], A[p])
# 分解
q = p + (r - p) / 2
(lmin, lmax) = find_max_and_min(A, p, q)
(rmin, rmax) = find_max_and_min(A, q + 1, r)
# 合并
return (min(lmin, rmin), max(lmax, rmax))
if __name__ == "__main__":
# A = [1]
# A = [1, 2]
A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
print(find_max_and_min(A, 0, len(A) - 1))5. [代码]扩展问题,找第二大数 跳至 [1] [2] [3] [4] [5] [全屏预览]
#--coding: utf8 --
def find_second_max(A, p, r):
if r - p == 0:
return (A[p], None)
elif r - p == 1:
if A[p] > A[r]:
return (A[p], A[r])
else:
return (A[r], A[p])
# 分解
q = p + (r - p) / 2
(lfmax, lsmax) = find_second_max(A, p, q)
(rfmax, rsmax) = find_second_max(A, q + 1, r)
# 合并
if lfmax > rfmax:
fmax = lfmax
smax = max(lsmax, rfmax)
else:
fmax = rfmax
smax = max(rsmax, lfmax)
return (fmax, smax)
if __name__ == "__main__":
# A = [1]
# A = [1, 2]
A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
print(find_second_max(A, 0, len(A) - 1))