【问题描述】 针对以非递增有序表表示的静态查找表,编写递归的折半查找算法。
【输入形式】该静态查找表从下标1开始存放数据,存放数据按照非递增顺序,具体输入形式如下:
5 //输入元素个数
33 29 25 20 12 //按照非递增顺序连续输入多个数,每个数之间用一个空格隔开
29 //输入需要查找的数
【输出形式】如果找到则输出该数据在查找表中的下标,如果找不到则输出0
如 查找29则会输出2
【样例输入】5
33 29 25 20 12
【样例输出】 2
递归
#include<iostream>
#include<stdio.h>
using namespace std;
int f = 0;
int Search(int a[], int l, int h, int k)
{
int m; //定义中间下标m 注意m为下标!! 中间值mid为a[m] !
if (l > h)
return -1; //如未找到 则l会与h重合 跳出
else
{
m = (l + h) / 2;
if (a[m] == k)
{
f = 1;
return m;
}
//选择区分时 应注意:原序列是升序还是降序?
if(k > a[m]) return Search(a, l, m - 1, k);
if (k < a[m]) return Search(a, m + 1, h, k);
}
}
int main()
{
int a[64], n,l,h,k;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &k);
int p = Search(a, 1, n, k);
if (f == 1)
cout << p;
else
cout << "0";
return 0;
}
使用递归方式时,先判断成立条件,再进行操作和往下递归
if(l>h)
return -1;
非递归
int Search(int a[], int l, int h, k)
{
int mid;
while (l <= h) //由while循环来完成
{
mid = (l + h) / 2; //下标折半
if (a[mid] == k)
return mid; //返回下标 结束程序
else if (k < a[mid])
{
l = mid + 1;
}
else
{
h = mid - 1;
}
}
//如未找到 则始终没有返回 此时需要返回一个值
return -1;
}