二分查找的循环版本和递归版本

来源:互联网 发布:封装继承多态java 编辑:程序博客网 时间:2024/06/08 10:32



二分查找是在有序的表中查找一个元素是否存在,时间复杂度为对数级别,在很多题目中都有它的变体,来复习一下它的递归版本实现和非递归版本。



代码以及测试函数:


#include <iostream>using namespace std;// 非递归版本int BinaryNorRec(int array[], int size, int key){int mid = -1;int left = 0;int right = size - 1;while (left <= right){mid = (left + right) / 2;if (array[mid] == key){return mid;}else if (array[mid] < key){left = mid + 1;}else{right = mid - 1;}}if (left > right)return -1;}// 非递归int BinaryRec(int arr[], int left, int right, int key){int mid = -1;if (left <= right){mid = (left + right) / 2;if (arr[mid] == key)return mid;else if (arr[mid] < key)return BinaryRec(arr, mid + 1, right, key);elsereturn BinaryRec(arr, left, mid - 1, key);}return mid;}// 测试递归版本void TestBinaryRec(){int array[] = { 4, 5, 6, 7, 8, 9, 10, 11 };int size = sizeof(array) / sizeof(array[0]);cout << "find: 4    " << BinaryRec(array,0, size-1, 4) << endl;cout << "find: 5    " << BinaryRec(array,0, size-1, 5) << endl;cout << "find: 6    " << BinaryRec(array,0, size-1, 6) << endl;cout << "find: 7    " << BinaryRec(array,0, size-1, 7) << endl;cout << "find: 8    " << BinaryRec(array,0, size-1, 8) << endl;cout << "find: 9    " << BinaryRec(array,0, size-1, 9) << endl;cout << "find: 10   " << BinaryRec(array,0, size-1, 10) << endl;cout << "find: 11   " << BinaryRec(array,0, size-1, 11) << endl;cout << "find: 12   " << BinaryRec(array,0, size-1, 12) << endl;cout << "find: 3    " << BinaryRec(array,0, size-1, 3) << endl;cout << "find: -1   " << BinaryRec(array,0, size-1, -1) << endl;//find: 4    0//find: 5    1//find: 6    2//find: 7    3//find: 8    4//find: 9    5//find: 10   6//find: 11   7//find: 12   -1//find: 3    -1//find: -1   -1}// 测试非递归版本void TestBinarySearch(){int array[] = { 4, 5, 6, 7, 8, 8, 9, 10, 11 };int size = sizeof(array) / sizeof(array[0]);cout << "find: 4    " << BinaryNorRec(array, size, 4) << endl;cout << "find: 5    " << BinaryNorRec(array, size, 5) << endl;cout << "find: 6    " << BinaryNorRec(array, size, 6) << endl;cout << "find: 7    " << BinaryNorRec(array, size, 7) << endl;cout << "find: 8    " << BinaryNorRec(array, size, 8) << endl;cout << "find: 9    " << BinaryNorRec(array, size, 9) << endl;cout << "find: 10   " << BinaryNorRec(array, size, 10) << endl;cout << "find: 11   " << BinaryNorRec(array, size, 11) << endl;cout << "find: 12   " << BinaryNorRec(array, size, 12) << endl;cout << "find: 3    " << BinaryNorRec(array, size, 3) << endl;cout << "find: -1   " << BinaryNorRec(array, size, -1) << endl;// 打印结果//find: 4    0//find: 5    1//find: 6    2//find: 7    3//find: 8    4//find: 9    5//find: 10   6//find: 11   7//find: 12   -1//find: 3    -1//find: -1   -1}int main(){TestBinarySearch();cout << endl; // 换行TestBinaryRec();return 0;}


阅读全文
0 0
原创粉丝点击