题目:给定数组arr,找出数组中的最大值和最小值。其中,数组中的值两两各不相同。
分析:采用分治法。将数组两两一对分组,如果数组元素个数为奇数个,就把最后一个元素单独分为一组,偶数个则不用,然后分别对每一组中相邻的两个元素进行比较,把两者中元素值较小的数放在数组的左边,值大的数放在数组的右边,比较n/2此就能够将数组分组完成。为此,最小值一定在每一组的左边部分,最大值一定在每一组的右边部分,接着只需要在每一组的左边部分查找最小值,右边部分查找最大值,查找分别需要比较n/2-1次和n/2-1次。总共大约为n/2*3。
code:
def getMaxAndMin(arr):
if arr is None:
print("参数不合法")
return
# 两两分组,把较小的数放在数组的左半部分,把较大的数放在右半部分
i = 0
while i < (len(arr) - 1):
if arr[i] > arr[i + 1]:
temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
i += 2
# 在各个分组的左半部分查找最小值
minNum = arr[0]
i = 2
while i < len(arr):
if arr[i] > minNum:
minNum = arr[i]
i += 2
maxNum = arr[1]
# 在各个分组的右半部分查找最大值
i = 3
while i < len(arr):
if arr[i] > maxNum:
maxNum = arr[i]
i += 2
# 如果数组中元素个数是奇数哥,最后一个元素被分为一组,需要与其比较再确定最大最小值。
if len(arr) % 2 == 1:
if maxNum < arr[len(arr) - 1]:
maxNum = arr[len(arr) - 1]
if minNum > arr[len(arr) -1]:
minNum = arr[len(arr) -1]
return maxNum, minNum
if __name__ == "__main__":
arr = [7, 3, 19, 40, 4, 7, 1]
print(getMaxAndMin(arr))
程序的运行结果为:40, 1