Alg 旋轉有序陣列的中二分查詢

2021-10-05 05:19:37 字數 1557 閱讀 7711

根據中位數與旋轉點相對位置查詢

切分陣列查詢

給定乙個沒有重複元素的旋轉陣列(它對應的原陣列是有序的),求給定元素在旋轉陣列內的下標(不存在的返回-1),時間複雜度為logn。

如[4,5,6,7,0,1,2]就是乙個旋轉陣列:

從中位數與旋轉點的相對位置看,可以有:

def searchinshiftarray(ary:list, ele:int)->int:

def bisearch(ary, start, end):

if start>end:

return -1

mid = (start+end)//2

if ary[mid] == ele:

return mid

if ary[mid]>ele:

return bisearch(ary, start, mid-1)

else: 

return bisearch(ary, mid+1, end)

def search(ary, start, end):

if start>end:

return -1

mid = (start+end)//2

if ary[mid] == ele:

return mid

if ary[mid]ary[mid]: # mid在旋轉點後,

if ary[end]>=ele:

return bisearch(ary, mid+1, end)

return search(ary, start, mid-1)

# mid在旋轉點前

return search(ary, mid+1, end)

else: # ary[mid]>ele

if ary[start]>ary[mid]: # mid在旋轉點後,

return search(ary, start, mid-1)

# mid在旋轉點前

if ary[start]<=ele:

return bisearch(ary, start, mid-1)

return search(ary, mid+1, end)

return search(ary, 0, len(ary)-1)

查詢有序陣列最方便的方式是二分查詢,而旋轉陣列也可以看作是由『旋轉點』(陣列中最小元素)切分的兩個有序陣列。可先找到旋轉點,然後分別在兩個有序陣列中查詢即可。

查詢旋轉點:

def findpivotpoint(ary:list)->tuple:

if ary[0]ary[end]:

return findpoint(ary, mid+1, end)

else: #

if ary[mid]return mid

else:

return findpoint(ary, start, mid-1)

index = findpoint(ary, 0, len(ary)-1)

return (true, index, ary[index])

有序陣列中二分法查詢

二分法查詢適用於資料量較大時,但是資料需要先排好順序。首先,從陣列的中間元素開始搜尋,如果該元素正好是目標元素,則搜尋過程結束,否則執行下一步。如果目標元素大於 小於中間元素,則在陣列大於 小於中間元素的那一半區域查詢,然後重複步驟1的操作。如果某一步陣列為空,則表示找不到目標元素。時間複雜度為 o...

二分查詢有序陣列

對於乙個有序字串陣列,用二分法查詢某一字串是否存在於該字串陣列中。函式原型為 bool binarysearch const vector array,const string target 注意這裡的有序指的是字典序,如字串陣列 a,ab,ac,bc,cd,d 就是有序字串陣列,而 a,b,ab ...

有序陣列的二分查詢

給出乙個有序陣列 公升序 以及指定的數值。返回指定數值在陣列中的下標 若不存在則返回 1 在傳入的公升序陣列arr中查詢是否有元素值與給定的number相等。param arr 有序陣列 公升序 param number 指定的數值 return 指定數值在該陣列中的下標值。返回 1表示不存在 st...