试将折半查找的算法改写成递归算法
[输入]
关键字序列,要查找的关键字key
[输出]
输出一个初始化后顺序查找表,关键字key对应的记录的位置
存储结构:
线性存储
算法的基本思想:
折半查找:递归算法,用下标low和high分别标记查找区间的两端,mid为区间中间点位置,如果要查找关键字等于中间点位置关键字,则查找成功,返回关键字对应记录的位置,如果要查找关键字大于中间点位置关键字,则修改low=mid+1,继续查找,否则修改high=mid-1并继续查找,若low大于high,则查找不成功,返回0;输出记录位置。
源程序
#include <bits/stdc++.h>
int Search(int* a, int k, int low, int hight)
{
int mid;
if (low > hight)
{
return 0;
}
mid = (low + hight) / 2;
if (a[mid] == k)
{
return (mid + 1);
}
else if (a[mid] > k)
{
return Search(a, k, low, mid - 1);
}
else
{
return Search(a, k, mid + 1, hight);
}
}
int main()
{
system("color f0");
int i, n, key, position;
printf("你有多少个数据要输入:\n");
scanf("%d", &n);
int p[n];
printf("请按递增序列输入你的数据(整型变量):\n");
scanf("%d", &p[0]);
for (i = 1; i < n; i++)
{
scanf("%d", &p[i]);
while (p[i] < p[i - 1])
{
printf("你输入的数据不合理,请重新输入:\n");
scanf("%d", &p[i]);
}
}
printf("请输入你要查找的数据:\n");
scanf("%d", &key);
position = Search(p, key, 0, n - 1);
if (position == 0)
{
printf("没有找到你要查找的数据!\n");
}
else
{
printf("你所查找的数据位于原有序表的第%d个位置!\n", position);
}
system("pause");
return 0;
}
该程序实现的功能完整地满足了题目的所有要求,但一些方面还可以优化。其时间复杂度为O(logn),空间上没有使用辅助空间。
注意折半查找查找失败的条件是low大于high;