c++之折半查詢(二分查詢)遞迴與非遞迴的實現
阿新 • • 發佈:2020-12-23
遞迴實現
template<typename T> int binary_search(T arr[], int len, int left, int right, int find) { // 必要引數檢查 if (NULL == arr || nullptr == arr || 0 > left || 0 > right || 0 > len) return -1; // 終止條件,陣列不存在該元素 if (left > right) return -2; int mid = (left + right) / 2; if (0 <= mid) { // 剛好找到, 就返回 if (arr[mid] == find) return mid; // find比中間值小, 繼續搜尋小於中間值部分 else if (arr[mid] > find) return binary_search(arr, len, 0, mid - 1, find); // find比中間值大,繼續搜尋大於中間值部分 else return binary_search(arr, len, mid + 1, right, find); } else return -3; }
非遞迴實現
template<typename T> int binary_search(T arr[], int len, const T find) { // 引數檢查 if (0 == len || nullptr == arr || NULL == arr || 0 > len) return -1; int low = 0; int high = len - 1; while (low < high) { // 找到中間值 int mid = (high + low) / 2; if (0 <= mid) { if (arr[mid] == find) return mid; else if (arr[mid] > find) high = mid - 1; else low = mid + 1; } else break; } return -2; }