折半查找法(BinarySearch)是一种基于折半原理(分治思想)的搜索算法,它是用来定位一个给定值在己排序的数据结构中的位置。
折半查找法的步骤:
1、在有序表中取一个中问位置的记录(折半点)
2、如果待查记录和折半点记录相等,则查找成功,否则;
3、如果待查记录小于折半点记录,则在折半点的左半区继续折半查找;
4、如果待查记录大于折半点记录,则在折半点的右半区继续折半查找:
5、重复上述过程,直到找到待查记录或查找范围为空;
6、若查找范围为空,则表示待查记录不在表中,查找失败。
代码
#include <stdio.h>
void bubble_sort(int *a, int len) // 冒泡排序(升序)
{
int tmp;
int i;
int j;
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - i - 1; j++)
{
if (a[j] > a[j + 1])
{
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
void print_array(int *a, int len) // 打印数组
{
int i;
for (i = 0; i < len; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}
int search(int *a, int begin, int end, int target) // 迭代查找
{
int mid;
while (begin <= end)
{
mid = (begin + end) / 2;
if (a[mid] == target)
{
return mid;
}
else if (a[mid] > target)
{
end = mid - 1;
}
else
{
begin = mid + 1;
}
}
return -1;
}
int bin_search(int *a, int begin, int end, int target) // 递归查找
{
int mid = (begin + end) / 2;
if (begin > end)
{
return -1;
}
if (a[mid] == target)
{
return mid;
}
else if (a[mid] > target)
{
return bin_search(a, begin, mid - 1, target);
}
else
{
return bin_search(a, mid + 1, end, target);
}
}
int main()
{
int target;
int a[] = {1, -22, 31, 44, 15, -6, 17, 28, -19, 110};
int ret;
print_array(a, 10);
bubble_sort(a, 10);
print_array(a, 10);
scanf("%d", &target);
ret = search(a, 0, 9, target);
if (ret < 0)
{
printf("Can't find %d\n", target);
}
else
{
printf("%d %d %d\n", ret, target, a[ret]);
}
return 0;
}