设置监视哨算法的实现也算是相当简单,和顺序查找的思路一样,但把查找数组a[]的第一个元素a[0]赋值为所要查找元素的值。下面是实现代码:
int Search_Seq(int a[], int length, int key)
{
int i;
a[0] = key;
for (i = length; a[i] != key; i--)
;
return i;
}
将要查找的值key赋值给a[0],然后从a[]数组下标最高位依次向最低比较(也就是说比较元素从数组最后一位,即length,移向最开始一位,即0,比较),一旦有a[i]与查找值key相等,则返回i值。由于a[0]已经是key值,所以数组中必然有一个值等于key(原数组没有的话会比较到a[0],a[0]与key值相等,故返回0),当返回值为0的时候,表明没有找到该值。
加入main():
int main(void)
{
int length, i, key,n;
int *a;
printf("输入长度:");
scanf("%d", &length);
a = (int *)malloc(sizeof(int)*(length + 1));
printf("输入各个元素的值:");
for (i = 1; i <= length; i++)
{
scanf("%d", &a[i]);
}
printf("输入查找的元素:");
scanf("%d", &key);
n=Search_Seq(a, length, key);
printf("该元素的位置为:%d\n",n);
return 0;
}
折半查找法:
折半查找法要求该数组为有序的,在实际操作中可以在输入之后多增加一步排序操作,此处实例就不加入此步骤,直接输入有序数组:
int Search_Bin(int a[], int key, int length)
{
int mid, high, low;
low = 1;
high = length;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] == key)
return mid;
else
if (a[mid] < key)
low = mid + 1;
else
if (a[mid]>key)
high = mid - 1;
}
return 0;
}
初始化low为1,high为数组长度。当low小于或等于high时,将low和high之和除以二之后赋值给mid,让mid指向查找范围内的中间的一个值。然后判断mid下标的值与key值之间的大小,若相等,返回mid;若mid下标的值大于key值,则将mid-1的值赋值给high,因为原来的mid到high部分包括mid已经确定大于要查找的值;同理,当mid下标的值小于key值的时候,将mid+1的值赋值给low。
加入main()测试:
int main(void)
{
int i, key, len, n;
int *p;
printf("输入长度:");
scanf("%d", &len);
printf("输入各个元素的值:");
p = (int *)malloc(sizeof(int)*(len + 1));
for (i = 1; i <= len; i++)
scanf("%d", &p[i]);
printf("输入要查找的值:");
scanf("%d", &key);
n = Search_Bin(p, key, len);
if (n == 0)
printf("没有找到该值\n");
else
printf("该值的位置为:%d\n", n);
return 0;
}