I\'m looking to optimize this linear search:
static int
linear (const int *arr, int n, int key)
{
int i = 0;
while (i < n) {
If you're on an Intel platform:
int linear (const int *array, int n, int key)
{
__asm
{
mov edi,array
mov ecx,n
mov eax,key
repne scasd
mov eax,-1
jne end
mov eax,n
sub eax,ecx
dec eax
end:
}
}
but that only finds exact matches, not greater than or equal matches.
In C, you can also use Duff's Device:
int linear (const int *array, int n, int key)
{
const int
*end = &array [n];
int
result = 0;
switch (n % 8)
{
do {
case 0:
if (*(array++) >= key) break;
++result;
case 7:
if (*(array++) >= key) break;
++result;
case 6:
if (*(array++) >= key) break;
++result;
case 5:
if (*(array++) >= key) break;
++result;
case 4:
if (*(array++) >= key) break;
++result;
case 3:
if (*(array++) >= key) break;
++result;
case 2:
if (*(array++) >= key) break;
++result;
case 1:
if (*(array++) >= key) break;
++result;
} while(array < end);
}
return result;
}