二分查找的概念
二分查找又稱爲折半查找,主要用於查找一個有序數組中某一個數的位置。
主要思想以下:
在一個有序數組中,取數組的中間值與要查找的數進行比較;
若要查找的數等於中間值,查找成功。ios
二分查找的步驟
若要查找的數大於中間值,則在右半區間繼續取中間值與要查找的數進行比較;
若要查找的數小於中間值,則在左半區間繼續取中間值與要查找的數進行比較;
直至最後要查找的數未出現過與中間值相等的狀況,查找失敗數組
二分查找的優點
二分查找由於每次查找都會把這個數據折半,因此效率相對較高。若是使用普通的查找可能會消耗太多的時間。
你們能夠試試看,在1-100之間隨便設定一個數字,只須要最多最多7次確定能猜對,每次問的都是這個數字和範圍中間的數字比大小,每次比完都能去掉一半的數字。spa
找某個數的位置
在有序數組中查找某個數,找到返回數的下標,不存在重複的值,沒有返回-1。code
【輸入描述】第一行兩個整數空格分開,分別表示序列長度n以及查詢次數m。
第二行輸出n個整數
接下來m行,每行一個整數,表示查詢的數字。
【輸出描述】輸出m行,每行爲查詢數字的位置(位置從1開始算)。
【樣例輸入】3 3
4 6 9
9
4
7
【樣例輸出】3
1
-1ci
找某個數的位置參考代碼io
#include<iostream> using namespace std; int Search(int a[] , int n, int key){ int low = 1; int high = n; while(low <= high) { int mid = low + ((high-low)/2); if(key == a[mid]) return mid; else if(key < a[mid])high = mid - 1; else low = mid + 1; } return -1; } int main() { int s[100000],n,m,b; cin>>n>>m; for(int i=1;i<=n;i++)cin>>s[i]; for(int i=1;i<=m;i++) { cin>>b; cout<<Search(s,n,b)<<endl; } return 0; }