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

来源:互联网 发布:9a91翡翠数据 编辑:程序博客网 时间:2024/05/28 16:25

设置监视哨算法的实现也算是相当简单,和顺序查找的思路一样,但把查找数组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;elseif (a[mid] < key)low = mid + 1;elseif (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");elseprintf("该值的位置为:%d\n", n);return 0;}



0 0
原创粉丝点击