二分查詢 折半查詢 和猜數字小遊戲

2021-08-04 03:46:10 字數 2046 閱讀 3013

一、二分查詢

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 猜對了 從以上過程可以看出,從中...