//二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n / 2]与x做比较,如果x = a[n / 2], 则找到x,
//算法中止;如果x<a[n / 2], 则只要在数组a的左半部分继续搜索x, 如果x>a[n / 2], 则只要在数组a的右半部搜索x
//时间复杂度为O()=O(logn)
//二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
//其缺点是要求待查表为有序表,且插入删除困难。
//举例子 查找23
//下标0 1 2 3 4 5 6
//数组11 17 23 34 46 49 62
//第一次 low =0 high =6, mid = 0+6/2=3,a[3]=34,改变high = mid-1 =2;
//第二次 low =0 hign =2, mid = 0+2/2=1,a[1]=17,改变low = mid+1=2;
//第三次 low =2 high =2, mid =2,a[2]刚好为23,返回下标2,则总共寻找了三次。
#include<iostream>
using namespace std;
//方法一 非递归
//二分法查找,x是要被查找的元素,n是数组中元素个数
//函数返回的是查找元素的下标
int ccount = 0;//标记查找次数
int binarySearch(int list[], const int n ,const int x)
{
int lower, high, mid;
lower = 0, high = n - 1;
while (lower <= high)
{
ccount++;
mid = (lower + high) / 2;
if (x == list[mid])
return mid;
else if (x < list[mid])//x在左半区间
high = mid - 1;
else //x在右半区间
lower = mid + 1;
}
return -1;//没找到
}
int main()
{
int a[] = { 11, 17, 23, 34, 46, 49, 62 };
int index = binarySearch(a, 7, 23);
cout << ccount<<" "<< index <<" "<< a[index] << endl;
system("pause");
return 0;
}
//方法二 递归
//int BinSearch(int list[], int low, int high, int x)
//{
// if (low <= high)
// {
// int mid = (low + high) / 2;
//
// if (x == list[mid])
// return mid;
//
// else if (x < list[mid])
// return BinSearch(Array, low, mid - 1, x);
//
// else if (x > list[mid])
// return BinSearch(Array, mid + 1, high, x);
// }
// else
// return -1;
//}
二分法查找
最新推荐文章于 2025-04-28 17:22:35 发布