二分搜索算法

14 阅读1分钟

二分搜索算法的前提是有一个已经排序好的数组

非递归实现

#include <iostream>
using namespace std;


// 二分搜索非递归实现
int BinarySearch(int arr[], int size, int val) {
    int first = 0;
    int last = size - 1;

    while (first <= last) {
        int mid = (first + last) / 2;
        if (arr[mid] == val) {
            return mid;
        }  else if (arr[mid] > val) {
            last = mid - 1;
        } else if (arr[mid] < val) {
            first = mid + 1;
        }
    }

    return -1;
}

int main() {
    int arr[] = {12, 25, 34, 39, 45, 56, 67, 78, 90};
    int size = sizeof(arr) / sizeof(arr[0]);
    cout << BinarySearch(arr, size, 39) << endl;
    cout << "---------" << endl;;
    cout << BinarySearch(arr, size, 99);
}

测试

./main
3
---------
-1

递归实现

#include <iostream>
using namespace std;


// 二分搜索递归实现
int BinarySearch(int arr[], int start, int end, int val) {
    if (start > end) {
      return -1;
    }

    int mid = (start + end) / 2;

    if (arr[mid] == val) {
      return mid;
    } else if (arr[mid] > val) {
      return BinarySearch(arr, start, mid - 1, val);
    } else if (arr[mid] < val) {
      return BinarySearch(arr, mid + 1, end, val);
    }
}

int main() {
    int arr[] = {12, 25, 34, 39, 45, 56, 67, 78, 90};
    int size = sizeof(arr) / sizeof(arr[0]);
    int val1 = BinarySearch(arr, 0, size - 1, 56);
    int val2 = BinarySearch(arr, 0, size - 1, 99);

    cout << val1 << endl << val2 << endl;
}

测试

./main
5
-1