搜尋 二分法

2021-06-06 10:29:54 字數 1552 閱讀 1272

input:待搜尋目標整數,目標陣列

output:找到目標整數的索引,找不到則  -1

constraints: 目標陣列有序排列 ,公升降序

二分法搜尋思想:

舉例說明:      

你是個摸牌高手,不用掀開麻將只需用手摸就能摸出牌面,桌面扣著80個麻將牌,不同的是麻將上刻的是80個1到500的公升序不連續數字,

形如: 2,3,6,12,13,15..... 為了證明你確實是個高手,你還被蒙上了眼睛,那你怎麼向眾人秀你的超能力呢

觀眾要求你快速的找到 大家說出的數字,二分法浮上你的心頭....

超能力過程:

你需要乙個助手在你矇眼情況下,

(a)幫助你把手按在桌上剩餘牌數中間的那張牌上,你用手摸看是否要找的牌,是則結束了

(b)不是,那麼,如果如果摸起來的牌小於 要找的牌 ,說明 目標牌 一定位於 80張牌攔腰分開 的後半部分, 前半部分牌可以扔掉了

繼續,助手幫你攔腰截斷桌面剩下的牌,你 重複(a)

結束條件:最終待搜尋陣列只有乙個元素 ,不是要搜尋的元素則沒找到

先貼上我的ugly遞迴方式

注意一點,最終搜尋到元素的索引是分半後新陣列的,所以需要記錄在原陣列中的索引,這是我的這個遞迴方式的醜陋之處,先放著,怎麼想的就怎麼記錄,像當時寫五子連珠尋路時也是用了乙個遞迴,結果在android機器上總記憶體溢位,後來同事一句話驚醒我,a*才是正途,基本功不紮實導致思考問題的方式,方向不對,數學真的是計算機的靈魂

package org.algorithm;

/** *

* @author administrator

* */

public class halfsearch ;

/*** 二分查詢使用遞迴方法後,找到的索引是新陣列的 需要記錄原有位置索引

*/private static int indexbasic = 0;

/*** 二分搜尋(遞迴方式) input:目標元素 ,目標陣列 output:目標元素是否存在於該陣列,存在則返回索引

* constraint:目標陣列有序排列

* * @param seachtarget

* @param arr_input

* @return -1 not found

*/private static int halfsearch(int searchtarget, int arr_input) else

} /**

* 把陣列攔腰折斷,檢查折斷點是否是要找的元素

*/int curindex = arr_input.length / 2;

// found !

if (arr_input[curindex] == searchtarget) else else

} }/**

* @param args

*/public static void main(string args)

}

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...

二分搜尋 二分法及運用

二分法查詢 通過不斷縮小解存在的範圍,在有序陣列中查詢特定元素的搜尋演算法。經常可見 二分法 與其他演算法結合的題目 1 首先,從陣列的中間開始搜尋,如果該位置的值剛好是目標,則表示找到,結束搜尋。2 如果第一步的搜尋到的值大於目標,則把陣列分成兩半,在陣列右邊區域查詢,然後重複步驟 1 的操作。如...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...