二分法是一種非常重要的思想。二分查詢法是一種比較重要的查詢演算法,其執行效率要比遍歷查詢快非常多
但是其必須有乙個條件是陣列必須有序,具體的排序演算法後面遇到再說。
假設陣列公升序,則可以寫出二分查詢的演算法:
//二分查詢,假設陣列公升序
intbinary_search
(int array,
int lenth,
int x)
else
if(x < array[mid]
)else
if(x == array[mid])}
return-1
;}//這個二分查詢的演算法也可以用遞迴實現
intbinary_search
(int arr,
int len,
int x)
else
if(x < arr[mid]
)else
if(x == arr[mid])}
return-1
;}
另外,二維陣列也可以利用類似二分的思想,這裡舉乙個非常簡單的例子。比如:
楊氏矩陣
有乙個二維陣列.
陣列的每行從左到右是遞增的,每列從上到下是遞增的.
在這樣的陣列中查詢乙個數字是否存在。
時間複雜度小於o(n);
陣列:1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
1 2 3
4 5 6
7 8 9
用二分的思想則時間複雜度是一定小於o(n)的。
//找到返回1,未找到返回-1
//因為下標是兩個,返回不了兩個數,則可以通過改變外部已經定義好的某些變數
//可以通過將傳進函式的外部引數通過指標改變
//也可以定義陣列或結構體等將結果帶出
intsearch
(int array[
3],int i,
int j,
int x)
else
if(x < array[mid_row]
[mid_col]
)else
if(x == array[mid_row]
[mid_col])}
return-1
;}
以下是一些測試
#include
#include
intmain()
;int ret =0;
ret =
binary_search
(arr,
sizeof
(arr)
/sizeof
(arr[0]
),5)
;printf
("%d\n"
, ret)
; ret =
binary_search
(arr,
sizeof
(arr)
/sizeof
(arr[0]
),12)
;printf
("%d\n"
, ret)
; ret =
binary_search
(arr,
sizeof
(arr)
/sizeof
(arr[0]
),5)
;printf
("%d\n"
, ret)
; ret =
binary_search
(arr,
sizeof
(arr)
/sizeof
(arr[0]
),12)
;printf
("%d\n"
, ret)
;int yang_arr[3]
[3]=
,,};
ret =
search
(yang_arr,3,
3,5)
;printf
("%d\n"
, ret)
; ret =
search
(yang_arr,3,
3,12)
;printf
("%d\n"
, ret)
;system
("pause");
return0;
}
二分查詢法
二分查詢要求 1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。優缺點 折半查詢法的優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。演算法思想 首先,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者...
二分查詢法
有序陣列中的find 方法 public int find long serchkey int lowerbound 0 int upperbound nelems 1 while true curin lowerbound upperbound 2 if a curin serchkey retu...
二分查詢法
演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到相同的元素,或者所查詢的序列範圍為空為止...