Python演算法 分治法查詢陣列中元素最小最大值

2021-09-25 23:21:35 字數 1840 閱讀 9214

給定陣列a1,a2,a3,...an,找出陣列中最大值和最小值。(陣列中兩兩各不相同)

演算法思想類似於上圖,將陣列兩兩分為一組,如果陣列元素奇數個,就把最後乙個元素單獨分為一組,然後分別對每一組中相鄰兩個元素比較,把二者中值小的數放在陣列左邊,值大的數放在陣列右邊,只需比較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。 因此,從此種情況上分析,該演算法是最優的。

分治演算法 折半查詢法

二分查詢演算法根據邊界情況不同,一般可分為兩種情況,一中是左閉右開區間,類似於 left,right 一種是左閉右閉區間,在非遞迴二分中,必須遵守一定的區間規則,否則會造成程式錯誤,即區間不能夠重複。思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。題目描...

演算法 分治法

include function 列印int型陣列 parameter int型陣列,陣列的長度 void displayarray int a,int n printf n function 劃分由下標s開始到t終止的int陣列 parameter int型陣列,陣列的起始座標,陣列的終點座標 r...

演算法基礎 分治法(基於Python)

有時候,你可能會遇到使用任何已知的演算法都無法解決的問題,這種時候,我們就可以試試分治法的思路。分治法的基本思想很簡單,顧名思義,就是將乙個大問題分解為若干個子問題,然後我們逐一地解決這些子問題,將所有子問題解決完畢,也就將整體的大問題解決完畢了。分治法的精髓 分 將問題分解為規模更小的子問題 治 ...