1.二分查找介绍
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
2. 算法要求
(1)采用顺序结构
(2)数组有序
递归代码:
#include <stdio.h>
#include <iostream>
using namespace std;
/**
*@brief递归实现二分查找
*@param s 要查找的值
*@param first 数组开始的位置
*@param last 数组的最高位置
*@param sum已经排序好的数组
*@return 返回值
*@author smallblack
*@date 2017.8.29
*/
int halfSearch(int s,int*sum,int first,int last) {
int mid = (first+last) / 2;
if (first>last) {
return -1;
}
else
{
if (sum[mid] == s) return mid;
else if (sum[mid]>s) {
//递归左边部分
halfSearch(s,sum,first,mid-1);
}
else if (sum[mid]<s) {
//递归右边的部分
halfSearch(s, sum, mid+1,last);
}
}
}
//测试代码
int main() {
int sum[] = {1,2,3,4,5,6,7,8,9,10,11,12};
int s, r;
printf("please input a number:\n");
scanf_s("%d",&s);
r = halfSearch(s,sum,0,11);
if (r == -1) {
printf("cannot find...");
}
else
{
printf("数字%d在%d的位置\n",s,r);
}
getchar();
getchar();
return 0;
}
非递归代码:
/**
*@brief 非递归实现二分查找
*@param s 要查找的值
*@param first 数组开始的位置
*@param last 数组的最高位置
*@param a已经排序好的数组
*@return 返回值
*@author smallblack
*@date 2017.8.29
*/
int binSort(int s,int* a,int first,int last)
{
while (first<last)
{
int mid = (first+last) / 2;
if (a[mid] == s)
{
return mid;
}
else if (a[mid]>s)
{
last = mid - 1;
}
else
{
first = mid + 1;
}
}
}