二分查找法:
#define M 1024
void search(int a[M], int num)
{
int tou = 0;
int wei = M - 1;
int zhong;
int flag = -1;
int ci = 0;
while (tou <= wei)
{
ci++;
zhong = (tou + wei) / 2;
printf("%d %d %d %d\n", tou, wei, zhong, ci);
if (num == a[zhong])
{
printf("一共查找%d次 找到:a[%d]=%d\n", ci, zhong, num);
flag = 1;//找到
break;
}
else if (num > a[zhong])
{
tou = zhong + 1;
}
else
{
wei = zhong - 1;
}
}
if (-1 == flag)
{
printf("没有找到\n");
}
}
//二分查找 前提数据 必须有序
void main()
{
int a[M];
for (size_t i = 0; i < M; i++)
{
a[i] = i;
printf("%d ", i);
}
printf("\n请输入要查找的数据:");
int num;
scanf("%d", &num);
search(a, num);
system("pause");
}
<img src="https://img-blog.csdn.net/20150801071450680?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20150801071353704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
-------------------------------------------
拉格朗日插值查找法:
<pre name="code" class="cpp">void search2(int a[M], int num)
{
int tou = 0;
int wei = M - 1;
int zhong;
int flag = -1;//一开始找不到
int ci = 0;
while (tou <= wei)
{
ci++;
//zhong =tou+ ( wei-tou) / 2;
zhong = tou + (wei - tou) *1.0*(num - a[tou]) / (a[wei] - a[tou]);
printf("%d %d %d %d\n", tou, wei, zhong, ci);
if (num == a[zhong])
{
printf("一共查找%d次 找到:a[%d]=%d\n", ci, zhong, num);
flag = 1;//找到
break;
}
else if (num > a[zhong])
{
tou = zhong + 1;
}
else
{
wei = zhong - 1;
}
}
if (-1 == flag)
{
printf("没有找到\n");
}
}
//二分查找 拉格朗日插值查找
void main()
{
int a[M];
for (size_t i = 0; i < M; i++)
{
a[i] = i;
printf("%d ", i);
}
printf("\n请输入要查找的数据:");
int num;
scanf("%d", &num);
search2(a, num);
system("pause");
}