二分查詢演算法根據邊界情況不同,一般可分為兩種情況,一中是左閉右開區間,類似於[left,right),一種是左閉右閉區間,在非遞迴二分中,必須遵守一定的區間規則,否則會造成程式錯誤,即區間不能夠重複。
思路:假設目標值在閉區間[l, r]中, 每次將區間長度縮小一半,當l = r時,我們就找到了目標值。
【題目描述】折半查詢法(half.cpp/c/pas)大魔導師培根曾經說過:「讀史使人明智,讀詩使人聰慧,演算使人精密,哲理使人深刻,倫理學使人有修養,邏輯修辭使人善辯。」由此可見書籍的重要性是不言而喻的。而與書籍天天打交道的圖書管理員,更是奪天地之造化,吸日月之精華的「神之職業」。據史料記載,魔法世界從古至今誕生的眾多不平凡的人物中,有不少人都曾經做過「圖書管理員」,如道家學派創始人老子,威軟公司創始人比耳、少林藏經閣的掃地神僧等等。所以,作為以馬虎自負出名的楚繼光,在魔法學院的社會實踐活動中又怎麼會放過這「天將降大任於斯人也」的必經鍛鍊呢。但想成為乙個合格的圖書管理員並不容易,他必須能夠在一排(10000以內)已按編號大小排好序的圖書中,快速地按編號查詢到某本書所在的位置。
【輸入格式】
輸入檔案第一行是n,表示有n個元素,第二行是n個數,第三行是m表示要查詢的數。
【輸出格式】
乙個數,即如找到該數,則輸出位置,否則輸出-1。
【輸入樣例】
2 4 6
【輸出樣例】
#include#include#include#define max 10001
using namespace std;
int a[max],key;
int search(int bot,int top)
cin >> key;
search(1,n);
return 0;
}
二分非遞迴模板共有兩個:
2.1 [l,mid - 1] [mid,r]
當我們將區間[l, r]劃分成[l, mid - 1]和[mid, r]時,其更新操作是r = mid - 1或者l = mid;此時為了防止死迴圈,計算mid時需要加1;
#include#include#include#define max 10001
using namespace std;
int a[max],key,top,bot,mid,n;
int search(int bot,int top)
cin >> key;
if(a[search(1,n)] == key) printf("%d\n",search(1,n));
else printf("-1\n");
return 0;
}
2.2 [l, mid] [mid + 1, r]
當我們將區間[l, r]劃分成[l, mid]和[mid + 1, r]時,其更新操作是r = mid或者l = mid + 1;計算mid時不需要加1;
#include#include#include#define max 10001
using namespace std;
int a[max],key,top,bot,mid,n;
int search(int bot,int top)
cin >> key;
if(a[search(1,n)] == key) printf("%d\n",search(1,n));
else printf("-1\n");
return 0;
}
小菜鳥乙個,理解不到位請及時指正。 折半查詢 分治法
include 分治策略 設a low.high 是當前的查詢區間,首先確定該區間的中點位置mid low high 2 然後將待查的k值與 a mid key比較 1.若k a mid 則查詢成功並返回該元素的物理下標 2.若ka mid 則要查詢的k必定位於右子表a mid 1.high 中,即...
演算法 折半查詢法
輸入 檔名稱 sum123.cpp 作 者 林海雲 完成日期 2015年1月12日 版 本 號 v2.0 問題描述 給定乙個排序好的陣列,使他可以具備查詢功能 輸入描述 要查詢的數 程式輸出 查詢數的位置 總結 此演算法查詢的依據是從左往右依次查詢,用乙個while語句控制的迴圈實現,在mid的le...
分治法與折半搜尋演算法
分治法 折半搜尋演算法 int binary search int p,int q,int key 要求陣列已經排序。1 divide 取中間節點r,分成兩個陣列 p,r r,q 2 conquer 判斷 r和key的大小,若 r key 返回,若 r key,遞迴處理 p,r 否則遞迴處理 r 1...