55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
|
#define LOG_N 42
|
||
|
|
||
|
static int delta[LOG_N];
|
||
|
|
||
|
void make_delta(int N)
|
||
|
{
|
||
|
int power = 1;
|
||
|
int i = 0;
|
||
|
do
|
||
|
{
|
||
|
int half = power;
|
||
|
power <<= 1;
|
||
|
delta[i] = (N + half) / power;
|
||
|
}
|
||
|
while (delta[i++] != 0);
|
||
|
}
|
||
|
|
||
|
int unisearch(int *a, int key)
|
||
|
{
|
||
|
int i = delta[0]-1; /* midpoint of array */
|
||
|
int d = 0;
|
||
|
while (1)
|
||
|
{
|
||
|
if (key == a[i])
|
||
|
{
|
||
|
return i;
|
||
|
}
|
||
|
else if (delta[d] == 0)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (key < a[i])
|
||
|
{
|
||
|
i -= delta[++d];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
i += delta[++d];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define N 10
|
||
|
int main(void)
|
||
|
{
|
||
|
int num, a[N] = {1,3,5,6,7,9,14,15,17,19};
|
||
|
make_delta(N);
|
||
|
printf("\nEnter an element to search: ");
|
||
|
scanf("%d", &num);
|
||
|
printf("%d is at index %d\n", num, unisearch(a, num));
|
||
|
return 0;
|
||
|
}
|