#include <iostream>
// Assumes that value is in the array
int LinearSearch(int *array, int size, int value)
{
if (size <= 1)
return 1;
for (int i = 0; i < size; i++)
if (array[i] == value)
break;
return i + 1;
}
// Assumes that value is in the array
int BinarySearch(int *array, int size, int value)
{
if (size <= 1)
return 1;
int count = 0;
int left = 0, right = size - 1;
while (right >= left)
{
count++;
int middle = (left + right) / 2;
if (value == array[middle])
return count;
if (value < array[middle])
right = middle - 1;
else
left = middle + 1;
}
return count;
}
void main(void)
{
const int SIZE = 1000;
int a[SIZE];
// Generate array
for (int i = 0; i < SIZE; i++)
a[i] = i;
int value = 1;
int index = BinarySearch(a, SIZE, value);
std::cout << "Number of compares to find " << value << " is " << index << std::endl;
}
Using the same driver code, but replacing LinearSearch with BinarySearch:
void main(void)
{
const int SIZE = 10000;
int a[SIZE];
srand(time(NULL));
// Generate array
for (int i = 0; i < SIZE; i++)
a[i] = i;
// Mix it up
// Shuffle(a, SIZE); // Don't need this now
// Search for numbers (10 sets)
for (int j = 0; j < 10; j++)
{
int total = 0;
int attempts = 1000;
for (i = 0; i < attempts; i++)
total += BinarySearch(a, SIZE, (rand() % SIZE));
cout << j + 1 << ". Average = " << (double)total / (double)attempts << endl;
}
}
Output:
1. Average = 13.51
2. Average = 13.492
3. Average = 13.501
4. Average = 13.483
5. Average = 13.46
6. Average = 13.445
7. Average = 13.517
8. Average = 13.451
9. Average = 13.465
10. Average = 13.516