二分查詢(折半查詢)

2021-07-09 02:26:32 字數 1741 閱讀 6551

二分查詢(折半查詢):

從有序序列中找到給出的要查詢的數字。

原理是:首先把乙個有序序列中間位置的值與要查詢的數比較,若相等則找到了有序序列中的此數;否則比較兩者的大小,若前者大,則把有序序列的中間位置以前的元素都去掉,餘下的元素組成乙個新的有序數列繼續上一步的操作,直到找到為止;若後者大,則把有序數列中間位置以後的元素都去掉,餘下的元素組成乙個新的有序數列,繼續第一步的操作,直到找到為止。若所有元素都與要找的數不同,則說明該有序序列中沒有要找的數。

優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。

具體過程可以參照下圖:

根據以上概念寫出**:

#include

int *binsearch(int *arr, int n, int se)

else

if (se > arr[mid])

else

}return null; //當找到數時,返回其在陣列中的下標,未找到時返回負值

}int main()

; //折半查詢的陣列必須是有序的

int key = 0;

int *ret = 0;

int size = sizeof(num) / sizeof(num[0]);

printf("please enter a number:");

scanf("%d", &key);

ret = binsearch(num, size, key);

printf("%d\n", *ret);

system("pause");

return

0;}

再次宣告,待查詢的序列必須是有序的才行。

程式中需要注意的幾個點是:

1、自定義二分查詢函式的返回值

怎樣設定返回值可以合的反應出找到了該數,並能確定他在有序序列中的位置,或者未找到該數。我用的方法是返回下標。因為我的有序序列是乙個陣列,所以當找到了該數時返回該數在陣列中的下標即可確定該數在陣列中的位置,沒有找到也很好處理,因為下標都是非負數,所以若是沒有找到,則返回乙個負數。

2、while的迴圈條件

3、mid的值不要寫成 mid = (left +right ) / 2 ;因為可能在left 與 right 相加的過程中發生溢位

因為left 和 right都是int型,是有範圍的(32位元組),若是left 和 right都是很大的數,接近於int能表示的最大數字,那麼兩數相加後就會溢位,因此用乙個較為保險的方法—-mid = left + (right-left)/ 2.

以上使用陣列下標的方式實現的,現在介紹一種用指標實現的方法。

int *binsearch(int *start, int count, int num)

else

if (*mid>num)

else

}else

else}}

return null;

}

這個**是不考慮陣列的排序方式的,不管陣列是從大到小排序還是從小到大排序都能解決。

很簡單的幾十行**就完成了。

折半查詢(二分查詢)

折半查詢 又稱二分查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有 序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前...

二分查詢(折半查詢)

時間限制 3000 ms 記憶體限制 65535 kb難度 3描述 在某一國度裡流行著一種遊戲。遊戲規則為 在一堆球中,每個球上都有乙個整數編號i 0 i 100000000 編號可重複,現在說乙個隨機整數k 0 k 100000100 判斷編號為k的球是否在這堆球中 存在為 yes 否則為 no ...

折半查詢(二分查詢)

折半查詢 又稱二分查詢 簡單的理解就是整形有序的陣列中,在查詢過程中把要查詢的與陣列最中間的數進行比較以次迴圈進行查詢,找到了返回下標,找不到返回 1。include stdio.h include stdlib.h 折半查詢函式 int binary search int arr,int key,...