C++ 二分查詢(折半查詢、Binary Search)演算法
阿新 • • 發佈:2019-01-07
思路:首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;
否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一
子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為
止,此時查詢不成功。
一、非遞迴實現:
#include <iostream> // 二分查詢:如果查詢到,就返回在陣列中的下標,否則返回-1 int searchBin(int arr[], int len, int x) { int low, high, mid; low = 0; high = len - 1; while(low <= high) { mid = (low + high) / 2; if(x == arr[mid]) return mid; else if(x < arr[mid]) high = mid - 1; else low = mid + 1; } return -1; } int main(int argc, const char * argv[]) { // insert code here... int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化陣列 int len, x, loc; // len儲存陣列的實際長度,x要查詢的數, loc位置 len = sizeof(arr) / sizeof(arr[0]); // 整個陣列長度 // 獲取陣列的實際長度:while(arr[i] != '\0') {count++} std::cout << "請輸入要查詢的數:\n"; while(std::cin >> x) { loc = searchBin(arr, len, x); // 呼叫二分查詢函式 if(loc >= 0) std::cout << "在陣列中找到了" << x << ",在陣列中是第" << (loc + 1) << "個。\n"; else std::cout << "在陣列中找不到" << x << std::endl; std::cout << "請繼續輸入要查詢的數:\n"; } return 0; }
二、遞迴實現:
#include <iostream> // 二分法:遞迴 int searchBin(int arr[], int x, int low, int high) { int mid; if(low > high) return -1; mid = (low + high) / 2; if(x == arr[mid]) return mid; else if(x < arr[mid]) return searchBin(arr, x, low, mid-1); else return searchBin(arr, x, mid+1, high); } int main(int argc, const char * argv[]) { // insert code here... int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化陣列 int len, x, loc; // len儲存陣列的實際長度,x要查詢的數, loc位置 len = sizeof(arr) / sizeof(arr[0]); // 整個陣列長度 std::cout << "請輸入要查詢的數:\n"; while(std::cin >> x) { loc = searchBin(arr, x, 0, len-1); // 呼叫二分查詢函式 if(loc >= 0) std::cout << "在陣列中找到了" << x << ",在陣列中是第" << (loc + 1) << "個。\n"; else std::cout << "在陣列中找不到" << x << std::endl; std::cout << "請繼續輸入要查詢的數:\n"; } return 0; }