前提
数组为纯数字数组
时间复杂度
时间复杂度为:O(n)
同时找出最小值和最大值的比较次数上限为:3⌊n/2⌋
伪算法
MINIMUM(A)
min=A[1]
for i = 2 to A.length
if min > A[i]
min = A[i]
return min
MAXIMUM(A)
max=A[1]
for i = 2 to A.length
if max < A[i]
max = A[i]
return max
minimunAndMaximum(A)
if A.length is even number
if A[1] > A[2]
min = A[2]
max = A[1]
else
min = A[1]
max = A[2]
for i = 2 to mod(A.length,2)
if A[2i-1] > A[2i]
if max < A[2i-1]
max = A[2i-1]
if min > A[2i]
min = A[2i]
else
if max < A[2i]
max = A[2i]
if min > A[2i-1]
min = A[2i-1]
else
min=A[1]
max=A[1]
for for i = 1 to mod(A.length,2)
if A[2i] > A[2i+1]
if max < A[2i]
max = A[2i]
if min > A[2i+1]
min = A[2i+1]
else
if max < A[2i+1]
max = A[2i+1]
if min > A[2i]
min = A[2i]
return min,max
Python算法
def minimum(A):
# 求数组最小值
min=A[0]
for i in range(1,len(A)):
if min > A[i]:
min = A[i]
return min
def maximum(A):
# 求数组最大值
max=A[0]
for i in range(1,len(A)):
if max < A[i]:
max = A[i]
return max
def minimumAndMaximum(A):
# 同时求最小值和最大值
if len(A)%2 == 0:
if A[0] > A[1]:
min = A[1]
max = A[0]
else:
min = A[0]
max = A[1]
for i in range(1,len(A)//2):
if A[2*i] > A[2*i+1]:
if max < A[2*i]:
max = A[2*i]
if min > A[2*i+1]:
min = A[2*i+1]
else:
if max < A[2*i+1]:
max = A[2*i+1]
if min > A[2*i]:
min = A[2*i]
else:
min = A[0]
max = A[0]
for i in range(1,len(A)//2):
if A[2*i] > A[2*i-1]:
if max < A[2*i]:
max = A[2*i]
if min > A[2*i-1]:
min = A[2*i - 1]
else:
if max < A[2*i-1]:
max = A[2*i - 1]
if min > A[2*i]:
min = A[2*i]
return min,max
运行结果
import numpy
a=list(numpy.random.randint(1,100,20,int))
print('数组:',a)
print('最小值:',minimum(a))
print('最大值:',maximum(a))
print('最值:', minimumAndMaximum(a))
数组: [36, 35, 62, 62, 79, 46, 82, 9, 12, 59, 94, 67, 70, 78, 94, 47, 72, 61, 98, 55]
最小值: 9
最大值: 98
最值: (9, 98)
本文介绍了一种在O(n)时间复杂度内同时找到数组中最小值和最大值的方法,并给出了具体的伪代码及Python实现。该算法通过一次遍历减少比较次数,适用于纯数字数组。
2177

被折叠的 条评论
为什么被折叠?



