二分查找——递归与非递归

来源:互联网 发布:kindle fire知乎 编辑:程序博客网 时间:2024/06/05 02:07

        二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功,返回当前位置下标;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功,返回-1

      时间复杂度为logN。

“test.cpp”

<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;#include <assert.h>//方法一(非递归)int BinarySearchNonR(int* arr,int size,int key){assert(arr);int left = 0;int right = size-1;int mid  = 0;while (left <= right){mid = (left + right)/2;if (arr[mid] > key){right = mid - 1;} else if (arr[mid] < key){left = mid + 1;}else//arr[mid] == key{return mid;}}//找不到返回-1return -1;}//方法二(递归)int BinarySearch(int* arr,int left,int right,int key){assert(arr);int mid = (left + right) / 2;//递归先写回溯条件if (arr[mid] == key){return mid;}if (arr[mid] > key){if (left > right){return -1;}BinarySearch(arr,left,mid-1,key);} else if (arr[mid] < key){if (left > right){return -1;}BinarySearch(arr,mid+1,right,key);}}void Test(){//非递归int arr[] = {0,1,2,3,4,5,6,7,8,9};int size = sizeof(arr)/sizeof(arr[0]);int key = 0;cin>>key;int ret = BinarySearchNonR(arr,size,key);cout<<ret<<endl;//递归int arr2[] = {10,20,30,40,50,60,70,80,90,100};int size2 = sizeof(arr2)/sizeof(arr2[0]);int key2 = 0;cin>>key2;int ret2 = BinarySearch(arr2,0,size2-1,key2);cout<<ret2<<endl;}int main(){Test();system("pause");return 0;}</span></strong>


0 0
原创粉丝点击