一、二分查詢
1、二分查詢的思想
前提:二分查詢的序列一定是按照公升序或降序排列,不然無法使用。
定義left指向第乙個元素,right指向最後乙個元素,mid指向中間元素(mid = left+(right-left)>>1
)
定義size = sizeof(arr)/sizeof(arr[0]) 可以求得陣列的整個長度,right = size -1;size 只能在函式外求得。
這個在(小結一維陣列,二維陣列)乙個寫得很好的博主寫的文章裡面有講到(捂臉遁走……)
假設尋找的key = 52
陣列(arr[mid] = 10) < key,將 left 賦值為(mid+1),重新計算mid的值。
假設尋找的key = 7
陣列(arr[mid] = 10) > key,將 right 賦值為(mid-1),重新計算mid的值。
以此利用迴圈即可得到所找 key 的位置,迴圈判斷的條件為(left<=right)
改進:這種實現的二分查詢只是固定的從0到最後乙個元素進行查詢,如果我不想這樣查詢呢?我們可以直接將查詢的範圍進行形參的傳遞,這樣的函式更具有靈活性。
2、求平均數
一般求平均數的時候,我們通用的是mid = (left + right)/2
這種求法在數學計算的時候沒有問題,但在計算中進行資料計算的時候,是要考慮記憶體分配的大小。如果我們的資料是整型的,資料佔的記憶體為32 bit,整型資料的範圍是(−
231)至
(231−
1)( −2
31)至(
231−1
)。如果(left + right)較大,就會造成記憶體溢位,丟失資料。
所以推薦使用mid = left +(right - left)/2
,這種演算法不會有記憶體溢位的問題出現。
mid = left + (right - left)>>1
更好點,位運算的計算速度更快。
3、源**
#include #include int binarysearch(int
left, int
right, int key, int arr)
else
if (arr[mid]>key)
else
}return -1;
}int main()
; int key = 23;
int ret = binarysearch(1, 9, key, arr);
if (-1 == ret)
else
system("pause");
return 0;
}
二、猜數字額,這個猜數字放在這裡呢,是因為我們猜數字的時候,是利用類似二分查詢的想法來的猜數字的。猜數字嘛,主要是隨機產生乙個範圍內的數字,然後猜猜猜就好了。
原始碼
#include
#include
int i = 0;
int count = 0;
int flag;
int main()
else
if (count>a)
else
}if (0==i)
system("pause");
return
0;}
二分查詢演算法(折半查詢)猜數字
二分查詢演算法是建立在有序陣列基礎上的 在未接觸到二分查詢演算法時,我們對陣列進行遍歷,每個元素進行比較,即順序查詢。二分查詢較順序查詢更優,因為這種演算法每一次比較都使查詢範圍縮小一半。演算法思想為 查詢過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則查詢過程結束 如果某一待查詢元素大...
猜數字遊戲,二分查詢 ,輸密碼遊戲
1.完成猜數字遊戲 首先這個 要先理解他如何猜數字。不可能是在 中寫乙個數,你來猜它吧。所以你得有乙個可以產生隨機數的函式。也就是rand 所以接下來就好寫了。只要通過迴圈比較來告訴它值低了 還是 高了 我是通過函式來實現的,乙個輸出函式,乙個遊戲函式。結合起來。define crt secure ...
猜數字遊戲 二分查詢顯威力
規則就像剛才說的一樣,現在開始猜數字,假設待猜數字為57,讓我們先用之前的猜法試一下,乙個乙個猜,從1開始,這樣猜的話,最少得猜57次,6要是99的話,得猜99次,現在讓我們試一下從中間開始的猜法。從50開始,則猜數過程如下 50 小了 75 大了 63 大了 57 猜對了 從以上過程可以看出,從中...