資料結構與演算法 二分查詢全家桶 C

2021-10-23 19:56:58 字數 4905 閱讀 8929

0、leetcode 704 二分查詢

給定乙個 n 個元素有序的(公升序)整型陣列 nums 和乙個目標值 target ,寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。

class

solution

if(target > nums[mid]

)else

}return-1

;// 沒有找到}}

;

明確變數的含義,維護迴圈不變數,小資料量除錯,大資料量測試。

上面的**時在【left,right】中尋找target, 下面的**是在【left, right)中尋找target。

class

solution

if(target > nums[mid]

)else

}return-1

;// 沒有找到}}

;

/*************************最基本的二分查詢*********************************/

intbinarysearchup

(int

* nums,

int numslen,

int key)

else

if(key < nums[mid]

)else

}return-1

;}intbinarysearchdown

(int

* nums,

int numslen,

int key)

else

if(key < nums[mid]

)else

}return-1

;}intbinarysearchuprecursive

(int

* nums,

int low,

int high,

int key)

int mid = low +

(high - low)/2

;//計算mid的位置

if(key == nums[mid]

)else

if(key > nums[mid]

)else

}

2-1、查詢目標值區域的左邊界 = 查詢與目標值相等的第乙個元素位置 = 查詢第乙個不小於目標值的元素位置
/*************************查詢目標值區域的左邊界*******************************************/

/*************************查詢與目標值相等的第乙個元素位置*********************************/

/*************************查詢第乙個不小於目標值的元素位置*********************************/

intbinarysearchlowerbound

(int

* nums,

int numslen,

int key)

else}if

(nums[low]

== key)

else

}

2-2、查詢目標值區域的右邊界 = 查詢與目標值相等的最後乙個元素位置 = 查詢第乙個不大於目標值的元素位置
/*************************查詢目標值區域的右邊界*******************************************/

/*************************查詢與目標值相等的最後乙個元素位置*********************************/

/*************************查詢第乙個不大於目標值的元素位置*********************************/

intbinarysearchupperbound

(int

* nums,

int numslen,

int key)

else}if

(key == nums[high]

)else

}

2-3、查詢第乙個大於目標值的數 = 查詢比目標值大但是最接近目標值的數
/*************************查詢第乙個大於目標值的數*******************************************/

/*************************查詢比目標值大但是最接近目標值的數*********************************/

/*我們已經找到了最後乙個不大於目標值的數,那麼再往後進一位,

返回high + 1,就是第乙個大於目標值的數。*/

intbinarysearchbiggerone

(int

* nums,

int numslen,

int key)

else}if

(high+

1< numslen && key == nums[high]

)else

}

2-4、查詢最後乙個小於目標值的數 = 查詢比目標值小但是最接近目標值的數
/*************************查詢最後乙個小於目標值的數*******************************************/

/*************************查詢比目標值小但是最接近目標值的數*********************************/

intbinarysearchlessone

(int

* nums,

int numslen,

int key)

else}if

(low -

1>=

0&& key == nums[low]

)else

}

3-1、查詢旋轉陣列的最小值元素下標(假設不存在重複數字)
/*************************查詢旋轉陣列的最小值元素下標(假設不存在重複數字)*********************************/

intbinarysearchrotateminunique

(int

* nums,

int numslen)

else

}return high;

//此時low=high,寫return high;一樣的

}

3-2、查詢旋轉陣列的最小值元素下標(假設存在重複數字)
/*************************查詢旋轉陣列的最小值元素下標(假設存在重複數字)*********************************/

intbinarysearchrotateminrepeated

(int

* nums,

int numslen)

else

if(nums[mid]

< nums[high]

)else

}return low;

}

3-3、在旋轉排序陣列中搜尋(假設不存在重複數字)
/*************************在旋轉排序陣列中搜尋(假設不存在重複數字)*********************************/

intbinarysearchkeyinrotateunique

(int

* nums,

int numslen,

int key)

else

if(nums[low]

<= nums[mid]

)else

}else

if(nums[mid]

<= nums[high]

)else}}

return-1

;}

3-4、在旋轉排序陣列中搜尋(假設存在重複數字)
/*************************在旋轉排序陣列中搜尋(假設存在重複數字)*********************************/

bool

binarysearchkeyinrotaterepeat

(int

* nums,

int numslen,

int key)

else

if(nums[low]

< nums[mid]

)else

}else

if(nums[mid]

< nums[high]

)else

}else

}return

false

;}

4、測試以上的函式
#include

using

namespace std;

假裝這裡有上述的所有函式

intmain()

;int data2=

;int data3=

;int data4=

;int data5=

; 這裡呼叫函式即可

bool num =

binarysearchkeyinrotaterepeat

(data5,13,

2);//此種情況顯示的是有或無

cout <<

"index of the number is "

<< num <<

"."

("pause");

return0;

}

資料結構與演算法 二分查詢

二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...

資料結構與演算法,二分查詢

1.時間複雜度 每次能去掉一半即 logn 2.實現方式 while迴圈 與 遞迴 我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow 堆疊溢位 而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。3.實現關鍵點 我總結了下,一共有以下四點 sta...

資料結構與演算法 二分查詢

基礎概念 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用陣列作為表的儲存結構。不妨設有序表是遞增有序的。通俗理解 每次首先找到陣列的中間位置 middle 然後把待查詢數 target 與middle進行比較。如果查詢數target ...