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...