Интерполяционный поиск - самый быстрый поиск в упорядоченном массиве.
В среднем, значение в последовательности из 32 чисел, каждое из
которых лежит в диапазоне от 0 до 100 вычисляется за 1-2 шага. Поиск
делением пополам в той же области будет показывать 3-4 шага.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
const int N = 32;
int main()
{
srand(time(NULL));
int list[N];
int prev=0;
// Create ordered list
for(int i=0;i<N;i++)
{
list[i] = rand() % 10 + prev;
prev = list[i];
printf("%d, ",list[i]);
}
printf("\n");
int value = rand() % 50;
printf("Search for %d\n",value);
// Search value
int L=0;
int R=N-1;
int c=-1;
int count=0;
int found=0;
while(L<=R && !found)
{
c = L + (double)((value - list[L]) * (R - L + 1)) /
(double)(list[R] - list[L]);
if (c<L || c>R)
break;
else if (value<list[c])
R = c - 1;
else if (value>list[c])
L = c + 1;
else if (value==list[c])
found=1;
count++;
}
if (!found)
printf("Not found\n");
else
printf("Index = %d\n",c);
return 0;
}
Справочник алгоритмов v0.05 © 2007-2025 Igor Salnikov aka SunDoctor