二分查詢二(二分查詢的經典變形問題)

2021-10-24 03:20:38 字數 2132 閱讀 6052

主要**:

int

bsearch1

(int

* a,

int n,

int value)

else

if(a[mid]

> value)

else

}return-1

;}

這段**的處理重點就是 a[mid] = value 時的情況,如果 mid 等於 0,即這個元素已經是陣列的第乙個元素,那毫無疑問,這個元素肯定就是我們要找的;如果 mid 不等於 0,但 a[mid] 的前乙個元素 a[mid-1] 不等於 value,那也說明 a[mid] 就是我們要找的第乙個值等於給定值的元素。

如果經過檢查之後發現 a[mid] 前面的乙個元素 a[mid-1] 也等於 value,那說明此時的 a[mid] 肯定不是我們要查詢的第乙個值等於給定值的元素。那我們就更新 high = mid - 1,因為要找的元素肯定出現在[low, mid-1]之間。

主要**:

int

bsearch2

(int

* a,

int n,

int value)

else

if(a[mid]

> value)

else

}return-1

;}

如果 a[mid]這個元素已經是陣列中的最後乙個元素了,那它肯定是我們要找的;如果 a[mid]的後乙個元素 a[mid+1]不等於 value,那也說明 a[mid]就是我們要找的最後乙個值等於給定值的元素。

如果我們經過檢查之後,發現 a[mid]後面的乙個元素 a[mid+1]也等於 value,那說明當前的這個 a[mid]並不是最後乙個值等於給定值的元素。我們就更新 low=mid+1,因為要找的元素肯定出現在[mid+1, high]之間。

主要**:

int

bsearch3

(int

* a,

int n,

int value)

else

ifelse low = mid +1;

}}low =0;

// 重新初始化low和high

high = n -1;

while

(low <= high)

// 說明給定值不在陣列中

else high = mid -1;

}else low = mid +1;

}}

型別三的**稍微有點長,因為這裡多了乙個查詢的操作,我們在進行查詢第乙個大於等於給定值的元素時,先判斷給定值是否在陣列中,並且因為我們要查詢的是第乙個大於等於給定值的元素,我們在查詢的時候還需要額外考慮該給定值在陣列中有多個相同值的情況,所以這時候我們就要用型別二的查詢方式來進行判斷,判斷完畢後直接返回該元素的下乙個元素的下標。

而如果給定值不在陣列中的話就要通過另外的乙個迴圈查詢方式來進行了。

查詢第乙個大於等於給定值的元素操作的幾個判斷標準:

如果給定值在陣列中,且是陣列中的第乙個或最後乙個元素時,函式還能不能給出正常的返回值

如果給定值在陣列中有多個相同的元素時,能否正確返回自己想要查詢的元素的下標

主要**:

int

bsearch4

(int

* a,

int n,

int value)

if(a[mid -1]

!= value)

else high = mid -1;

}}low =0;

// 重新初始化low和high

high = n -1;

while

(low <= high)

// 進入這個迴圈說明給定值不在陣列中

else low = mid +1;

}else high = mid -1;

}return-1

;}

型別四的查詢操作以及判斷標準與型別三的差不多,部分細節已經在**中注釋,這裡就不多表述。

值得注意的是,當給定值在陣列中時,型別三借助型別二進行判斷;型別四借助型別一進行判斷。

變形二分查詢

title 資料結構與演算法 專案 主題 二分查詢 description 分析 1 查詢的是乙個有序的資料集合 2 每次查詢都是與區間的中間元素進行對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為0 date 2021 version 0.1版本 author coff...

二分查詢及其變形

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

二分查詢及其變形

最基本的二分查詢模版 在有序陣列a中查詢key,如果找到,返回位置索引,否則,返回 1 int binarysearch int a,int n,int key else if a mid key else return 1 變種1 如果a有多個key元素,返回最大的,否則,返回 1 int bin...