題目說明:
二分查詢法是對一組有序的數字中進行查詢,傳遞相應的資料,進行比較查詢到與原資料相同的資料,查詢到了返回對應的陣列下標,失敗返回-1。
題目解析:
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。
二分查詢可以解決(預排序陣列的查詢)問題:只要陣列中包含t(即要查詢的值),那麼通過不斷縮小包含t的範圍,最終就可以找到它。其演算法流程如下:
1、一開始,範圍覆蓋整個陣列。
2、將陣列的中間項與t進行比較,如果t比陣列的中間項要小,則到陣列的前半部分繼續查詢,反之,則到陣列的後半部分繼續查詢。
3、如此,每次查詢可以排除一半元素,範圍縮小一半。就這樣反覆比較,反覆縮小範圍,最終就會在陣列中找到t,或者確定原以為t所在的範圍實際為空。
程式**:
#include usingnamespace
std;
//遞迴函式
templateint binarysearch(t* data, int low, int high, int
key)
int mid = (high + low) / 2
;
if (data[mid] ==key)
else
if (data[mid] >key)
else}//
非遞迴函式實現
templateint binarysearch2(t* data, int len, int
key)
else
if(data[mid] >key)
else
}return -1;}
test(pojs, tbinarysearch)
; assert_eq(binarysearch(d1,
0, 7, 4),3
); assert_eq(binarysearch2(d1,
8, 4),3
); assert_eq(binarysearch(d1,
0, 7, 9),-1
); assert_eq(binarysearch2(d1,
8, 9),-1
);
int d2 = ;
assert_eq(binarysearch(d2,
0, 0, 2),0
); assert_eq(binarysearch2(d2,
1, 2),0
); assert_eq(binarysearch(d2,
0, 0, 3),-1
); assert_eq(binarysearch2(d2,
1, 3),-1
);}
經典演算法 二分查詢
二分查詢這種老生常談的話題,說的很簡單,但是仍然有些大夥不明白,所以這裡希望自己能夠寫出一篇很淺顯易懂的部落格幫助大家理解 給定陣列已經排序好,然後對其進行編號。這裡我們預設是從小到大的,否則演算法就要進行更改了 思想 因為陣列是有序的,所以每次和陣列中間的乙個比較,通過和其大小的關係,然後再折半比...
經典的查詢演算法1 二分查詢
二分查詢演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 在本篇文章中為了說明問題的方便,假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到...
經典演算法學習 二分查詢
在所有的查詢演算法中,二分查詢是最簡單一種。二分查詢要求原先的序列是已經排序的,每次都是以序列中間的數字作為比較,如果小於中間的數字,那麼就在序列左邊繼續遞迴查詢 如果大於中間的數字,那麼就在序列右邊繼續遞迴查詢。直到找到該數字,或者直到序列中只有乙個數字的時候都還沒找到,則查詢失敗。查詢的時間複雜...