CodeForces-731F Video Cards 數論,分塊
阿新 • • 發佈:2020-09-13
有15個數按由大到小順序存放在一個數組中,輸入一個數,要求用折半查詢法找出該數是陣列中第幾個元素的值。如果該數不在陣列中,則輸出"無此數"
【答案解析】
二分查詢是一個非常高效簡單的查詢演算法,筆試和麵試中非常喜歡考察。
折半查詢又叫二分查詢,查詢的前提是序列中元素必須有序,假設區間使用[left, right)標記,待查詢元素為key,具體查詢的方式如下:當區間[left, right)有效時迴圈進行一下操作
- 找到[left, right)區間中間位置
- 如果key等於中間位置元素,則找到,返回該元素在陣列中的下標
- 如果key小於中間位置元素,到陣列的左半側繼續二分查詢
- 如果key大於中間位置元素,到陣列的右半側繼續二分查詢
如果迴圈結束時還沒有找到,則不存在該元素。
【程式碼實現】
#include<stdio.h> int main() { int array[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; int left = 0; int right = sizeof(array) / sizeof(array[0]); int key = 0; printf("請輸入要查詢的數字: "); scanf("%d", &key); // 二分查詢 while (left < right) { // 找到中間位置 int mid = left + ((right - left) >> 1); if (key == array[mid]) { printf("%d\n", mid); break; } else if (key < array[mid]) { right = mid; } else { left = mid + 1; } } if (left >= right) printf("無此數\n"); return 0; }
【結果截圖】
假設陣列中元素為:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14