二分查詢的遞迴和非遞迴方式

2021-08-19 06:32:56 字數 2200 閱讀 1609

1.典型的二分查詢的兩種方式(注意二分查詢的適用條件是遞增的陣列)

1).遞迴方式

class binarytree

; system.out.println(search(a,12,0,a.length-1)); }

public static int search(int a,int data,int low,int high)

else

}else

}}

2).非遞迴方式(while迴圈方式)

class binarytree

; system.out.println(search(a,11)); }

public static int search(int a,int data)

else

}return -1;

}}

說明:int pivot = low + (high-low)/2;其實就是int pivot = (low+high)/2,使用low+(high-low)是為了防止溢位,例如int型別數值的最大值是2^32 - 1,如果數的個數很大,此時low+high可能會溢位。

2.使用二分查詢的思想來解題:

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0

分析:本題給出的陣列一定程度上是排序的,因此可以試者使用二分查詢法尋找最小值。

1)使用low和high分別指向陣列的第乙個元素和最後乙個元素。如果沒有旋轉第乙個元素是小於等於最後乙個元素,旋轉後第乙個元素應該是大於等於最後乙個元素(等於是有重複元素的情況)

2)中間元素大於第乙個元素,此時說明中間元素位於前面的遞增子陣列中,此時最小元素位於中間元素後面的。我們可以讓low指向中間元素。

3)中間元素小於第乙個元素,此時說明中間元素位於後面的遞增子陣列中,此時最小元素位於中間元素的前面,我們可以讓high指標指向中間元素。

4)通過2)3)可以縮小尋找的範圍,重複2)3)直到low+1=high時,high指向的元素就是最小元素

5)考慮幾種特殊情況,如果把排序陣列的前面0個元素搬到最後面,即排序陣列本身,此時第乙個元素就是最小的。

6)和都可看成是遞增排序陣列的旋轉,此時mid,low,high指向的數都相同,第一種情況下,中間元素位於後面的子陣列,第二種情況,中間數字位於前面的子陣列,此時只能採用順序尋找的方式。

**實現:

public class solution

if(array[0]=a[high])

//如果下標low,high和mid相等,這時候就需要順序查詢

int mid = (low + high)/2;

if(a[low]==a[high]&&a[low]==a[mid])

if(a[mid]>=a[low])else if(a[mid]<=a[low])

}return a[0];

}public int mininorder(int a,int low,int high)和數字3,由於3在這個陣列中出現了4次,因此輸出4。

思路:該題的陣列是乙個排序陣列,思路找到第一次出現3的位置,和最後出現3位置,兩者相減就得到3的個數。可以考慮使用二分查詢法,如上面的數字所示,典型的二分查詢在找到數字3後就停止了,該題中可以在找到3後(第一次找到的是中間的3),判斷3前面的數字是不是3(前面有數字的情況下,如果前面沒有數字,那麼這個3肯定就是第一出現的3),如果前面的數字不是3,那麼找到的3就是一次出現的3,而如果前面的數字也是3,那麼就在陣列的前半段繼續查詢3,直到找到第一次出現3的位置。同樣的方法找到最後乙個出現3的位置,將兩個位置相減就得到出現的個數。

**實現:

class solution

public int getfirstk(int array,int k,int low,int high)

else}}

return -1;                //如果沒有找到該數字,返回-1

}public int getlastk(int array,int k,int low,int high)

else if(array[mid]二分查詢的變種:

二分查詢演算法的非遞迴方式和遞迴方式

二分查詢非遞迴方式實現 param arr 要查詢的陣列 param target 要查詢的值 return 找到返回target再陣列中的索引值 沒找到返回 1 public static intbinarysearch int arr,int target if target arr mid e...

二分查詢 非遞迴方式

首先我們要清楚使用我們的二分查詢演算法的前提條件 二分查詢法只適用於從有序的數列中進行查詢 比如數字和字母等 將數列排序後再進行查詢 二分查詢的思路 二分查詢會用到遞迴的思想,當然也有非遞迴的方式,我是分開來學習了 1.首先確定陣列的中間下標mid mid left right 2 2.讓需要查詢的...

二分查詢 遞迴和非遞迴

二分查詢要求 資料儲存在順序儲存結構中 數字有序排放 原理 將陣列分為三部分,依次是左值,中值,右值 將要查詢的值和陣列的中值進行比較,若小於中值則在中值前 面找,若大於中值則在中值後面找,等於中值時直接返回。然後依次是乙個遞迴過程,將前半部分或者後半部分繼續分解為三部分。迴圈實現二分查詢 temp...