Python算法——分治法查找数组中元素最小最大值

要求:

       给定数组a1,a2,a3,...an,找出数组中最大值和最小值。(数组中两两各不相同)

分析:

Python算法——分治法查找数组中元素最小最大值_第1张图片

       算法思想类似于上图,将数组两两分为一组,如果数组元素奇数个,就把最后一个元素单独分为一组,然后分别对每一组中相邻两个元素比较,把二者中值小的数放在数组左边,值大的数放在数组右边,只需比较n/2次就可以将数组分组完成。这时候最小值在每一组左边部分,最大值在每一组右边部分,接着在每一组左边部分找最小值,右边部分找最大值,查找分别需比较n/2-1次和 n/2-1次。因此,总共比较次数约为(n/2)+(n/2-1)+(n/2-1)=3n/2-2次。

实现代码:

# -*- coding:utf-8 -*-
class MaxMin():
    def __init__(self):
        self.max = None
        self.min = None
    def getMax(self):
        return self.max
    def getMin(self):
        return self.min
    def GetmaxAndmin(self,arr):
        if arr==None:
            print("参数不合法")
            return
        i = 0
        lens = len(arr)
        self.max = arr[0]
        self.min = arr[0]
        #两两分组,把较小放到左半部分,较大放到右半部分
        i = 0
        while i < (lens-1): #lens-1,否则会下标越界
            if arr[i]>arr[i+1]:
                tmp = arr[i]
                arr[i] = arr[i+1]
                arr[i+1] = tmp
            i += 2
        #在各个分组左半部分找最小值
        self.min = arr[0]
        i = 2
        while i < lens:
            if arr[i] < self.min:
                self.min = arr[i]
            i += 2
        #在各个分组右半部分找最大值
        self.max = arr[1]
        i = 3
        while i < lens:
            if arr[i] > self.max:
                self.max = arr[i]
            i += 2
        #如果数组元素个数是奇数,最后一个元素被分为一组,需特殊处理
        if lens % 2 == 1:
            if self.max < arr[lens-1]:
                self.max = arr[lens-1]
            if self.min > arr[lens-1]:
                self.min = arr[lens-1]

if __name__ == "__main__":
    array = [7,3,19,40,4,7,1]
    m = MaxMin()
    m.GetmaxAndmin(array)
    print("max="+str(m.getMax()))
    print("min="+str(m.getMin()))

运行结果:

max=40
min=1

性能分析:

       无论是最好、最坏或者平均情况,该MaxMin分治算法所用的比较次数都是3n/2-2。 而实际中,任何一种以元素比较为基础的找最大值最小值元素的算法,其元素比较次数的下界为3n/2-2。 因此,从此种情况上分析,该算法是最优的。 

你可能感兴趣的:(算法)