一文讀懂之資料結構之二分查詢 迴圈遞迴實現)

2021-10-01 03:57:47 字數 2439 閱讀 9080

二分搜尋:折半查詢法binarysearch

使用二分法的要求:

1:被搜尋的數列必須是線性有序(序號)的數列。比如陣列。

2:被搜尋的數列必須是公升序的(降序)。

時間複雜度:t(n) = o(log2n)

空間複雜度:s(n) = o(1)

實現思想:

通過兩個變數:

low:待搜尋區域的最小下標,一開始是0

high:帶搜尋區域的最大下標,一開始是length-1

mid:定位到low和high中間元素的下標(high+low)/2

過程圖如下:

迴圈**實現:

1、當左角標小於等於右角標時,進入迴圈體

2、迴圈體中:(1)當mid索引對應的陣列值等於所要查詢的key值跳出迴圈,返回mid索引;(2)當key比arr[mid]小時,mid需要左移,因此high改變成mid-1,隨後在改變mid值(3)當迴圈結束還沒有找到,說明陣列中沒有要找的值,同樣返回-1

/**

* 定義迴圈二分法,如果存在返回索引,否則返回-1

* @param arr

* @param key

* @return

*/public

static

intbinnarysearch

(int

arr,

int key)

else

if(arr[mid]

> key)

else

mid = low + high >>1;

}//當迴圈結束還沒有找到,說明陣列中沒有要找的值,同樣返回-1

return-1

;}

我們需要乙個測試陣列:

1、定義乙個生成隨機數的方法

/**

* 生成隨機數

** @param min

* @param max

* @return

*/public

static

intgetrandomnum

(int min,

int max)

2、定義乙個生成陣列的方法,用於得到乙個指定長度的,指定區間的陣列,陣列元素型別int

/**

* 生成隨機數組

2. 遞迴**實現:

2.1對指定陣列的指定區間查詢指定的值

/**

* 二分查詢:對指定陣列的指定區間查詢指定的值

** @param arr

* @param low

* @param high

* @param key

* @return

*/public

static

intbinarysearch

(int

arr,

int low,

int high,

int key)

else

if(arr[mid]

> key)

else

return

binarysearch

(arr, low, high, key)

;}

2.2二分檢視可控制區間

/**

* 遞迴查詢陣列中的值控制區間

** @param arr

* @param key

* @return

*/public

static

intrecursion

(int

arr,

int key)

2.3測試類

一文讀懂資料結構之順序查詢

小結下目前的查詢演算法和排序演算法。查詢演算法 1 順序查詢 遍歷元素,逐個和要查詢的key比較 2 二分查詢 先排序,然後通過中間數來縮小查詢範圍。排序演算法 1 氣泡排序 相鄰元素挨個比,大的放到後邊,有點順序查詢的感覺。遍歷 2 選擇排序 從無序區中直接選擇乙個最小的元素 這個過程就是有點像冒...

資料結構之二分查詢

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其 缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成...

資料結構之二分查詢

上面我們介紹了順序查詢,但是它的時間複雜度為o n 讓人很受傷啊,所以有了二分查詢,二分查詢是乙個時間複雜度為o logn 的演算法,當然都是說的一般情況下,二分 二分,看名字就知道它的核心是什麼了,就是不斷地額逼近查詢值。include define max len 20 typedef stru...