當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。
基本思想:假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功;若x小於當前位置值,則在數列的前半段中查詢;若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止。
演算法:
假如有一組數為3,12,24,36,55,68,75,88要查給定的值24.可設三個變數front,mid,end分別指向資料的上屆,中間和下界,mid=(front+end)/2.
1.開始令front=0(指向3),end=7(指向88),則mid=3(指向36)。因為mid>x,故應在前半段中查詢。
2.令新的end=mid-1=2,而front=0不變,則新的mid=1。此時x>mid,故確定應在後半段中查詢。
3.令新的front=mid+1=2,而end=2不變,則新的mid=2,此時a[mid]=x,查詢成功。
如果要查詢的數不是數列中的數,例如x=25,當第三次判斷時,x>a[mid],按以上規律,令front=mid+1,即front=3,出現front>end的情況,表示查詢不成功。
例:在有序的有n個元素的陣列
中查詢使用者輸進去的資料x。
基本原理:
1.確定查詢範圍front=0,end=n-1,計算中項mid(front+end)/2。
2.若a[mid]=x或front>=end,則結束查詢;否則,向下繼續。
3.若a[mid]x,說明待查詢的元素值只可能在比中項元素小的範圍內,則把mid-1的值賦給end,並重新計算mid,轉去執行步驟2。
[一維陣列,折半查詢]
c**:
int search(int *a,int key,int low,int high) int main() ; int i = search(a,99,0,sizeof(a)/sizeof(a[0])-1); cout << i << endl; return 0; }
c++**:#include#define n 10 using namespace std; int main() if(a[mid]!=x) cout<<"沒找到!"<
二分法學習筆記
當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。基本思想 假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功 若x小於當前位置值,則在數列的前半段中查詢 若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止。演算法 假如有一組數為...
ACM二分法學習小結
1 二分查詢 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。2 二分查詢的基本思想 二分查詢的基本思想是 1 首先確定該區間的中點位置 2 然後將待查的k值與r mid key比較 若相...
演算法學習 二分法
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法,前提是資料結構必須先排好序,可以在資料規模的對數時間複雜度內完成查詢。但是,二分查詢要求線性表具有有隨機訪問的特點 例如陣列 也要求線性表能夠根據中間元素的特點推測它兩側元素的性質,以達到縮減問題規模的效果。舉個簡單的例子...