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