c语言监视,C语言设置监视哨的顺序查找、折半查找算法的实现

设置监视哨算法的实现也算是相当简单,和顺序查找的思路一样,但把查找数组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;

}

a4c26d1e5885305701be709a3d33442f.png

折半查找法:

折半查找法要求该数组为有序的,在实际操作中可以在输入之后多增加一步排序操作,此处实例就不加入此步骤,直接输入有序数组:

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;

}

a4c26d1e5885305701be709a3d33442f.png

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值