折半查找法怎么找?
①折半查找法是效率较高的一种查找方法。
②折半查找法怎么找?
答:假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是:设查找数据的范围下限为l=1,上限为h=5,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。
C语言,用折半查找算法在给定的有序序列中查找与给定值k相等的第一个元素,输出其所在位置及比较的次数?
折半查找需要先对数据进行排序。 以上是冒泡排序算法的实现。折半查找算法描述如下:在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:
1) 待查找数据值与中间元素值正好相等,则放回中间元素值的索引。
2) 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。
3) 待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值4) 如果最后找不到相等的值,则返回错误提示信息。 实现如下:复杂度分析:折半查找就像搜素二叉树:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为log2(n+1)-1,其算法复杂度为O(log(n))。
折半查找的适用条件?
适用的前提条件:
1. 存储在数组中(例如一维数组)
2. 数组元素为有序(例如升序)查找的基本思想:折半查找,设查找的元素为value value与中间元素(middle = left + (right -left) / 2这样做的好处防止中间元素出现越界)比较,若比中间值小则查找范围在middle + 1继续查找,若比中间值大则查找范围在middle -1,若与中间值相等则查找结束索引元素为value = middle。
关于折半查找的比较次数?
第五个查找1次 第二个和第七个查找两次 第一,第三和第六,第八要查找三次 第四和第九要查找四次 一共25次 ASL=25/9 查找值为21的结点,需要比较2次。
最早的二分查找代码什么时候出来的?
推荐答案的 code 有问题,并没有考虑到若待查数的下标是 0 怎么办?所以若顺序表中不存在待查元素 应该 return -1
加上主函数的最后两行调用两次查找函数很多余,代码显得不够简练。
建议改成:
#include <stdio.h>#include <stdlib.h>int Search(int *a, int key){ // 在顺序表中折半查找 key的数据元素。若找到,则函数值为 int low = 0, mid; // 该元素的数组下标;否则为0。 int high = 14; while (low <= high) { mid = (low + high) / 2; if (key == a[mid]) return mid; // 找到待查元素 else if (key < a[mid]) high = mid - 1; // 继续在前半区间进行查找 else low = mid + 1; // 继续在后半区间进行查找 } return -1; // 顺序表中不存在待查元素}void main(){ int *a, key, i; int b[15] = {0}; a = b; printf("请自小到大输入15个整数:\n"); for (i = 1; i <= 15; i++) { scanf("%d", &b[i - 1]); printf("\n"); } printf("请输入你要查找的数:\n"); scanf("%d", &key); i = Search(a, key); if (-1 == i) printf("你要查找的数不在目标数组中!\n"); else printf("你要查找的数的数组下标为 %d \n", i);}
还没有评论,来说两句吧...