3. 数据结构进阶三静态查询之折半查询

来源:互联网 发布:网络代理app软件 编辑:程序博客网 时间:2024/06/02 03:58

3. 数据结构进阶三静态查询之折半查询

“但是话不行,要紧的是做。 --鲁迅”

继续来看静态查询的折半查询。

1.  折半查找

折半查找要求查找表用顺序存储结构存放且各数据元素按关键字有序(升序或隆序)排列,也就是说折半查找只适用于对有序顺序表进行查找。
    折半查找的基本思想是:首先以整个查找表作为查找范围,用查找条件中给定值k与中间位置结点的关键字比较,若相等,则查找成功,否则,根据比较结果缩小查找范围,如果k的值小于关键字的值,根据查找表的有序性可知查找的数据元素只有可能在表的前半部分,即在左半部分子表中,所以继续对左子表进行折半查找;若k的值大于中间结点的关键字值,则可以判定查找的数据元素只有可能在表的后半部分,即在右半部分子表中,所以应该继续对右子表进行折半查找。每进行一次折半查找,要么查找成功,结束查找,要么将查找范围缩小一半,如此重复,直到查找成功或查找范围缩小为空即查找失败为止。

简化描述如下:

条件:有序数组

原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

时间复杂度:O(logn)

除了折半查找之外,还有斐波那契查找和插值查找。

为什么一定要折半,而不是折四分之一或者其他呢?插值查找:根据要查找的关键字key与查找表中最大最小记录的关键字比较后使用插值公式计算下一步查找范围的查找方法。

 

2.  代码实现

代码实现非常简单,定义一个数组15个值,1到15.

然后输入一个要查找的值。

如果该值大于中间的值,则取后面一半。

如果该值小于中间的值,则取面前的一半。

以此循环,直到缩小范围找到该值,或者不存在该值。

 

 

 

 

 

3.  源码

 

#include<stdio.h>

int main()

{

           intt[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

           inta,b,c,mid;

           a=0;b=14;

           scanf("%d",&c);

           while(a<=b)

           {

                     mid=(a+b)/2;

                     if(c==t[mid])

                     {

                                printf("%d",t[mid]);

                                break;

                     }        

                     elseif(c>t[mid])

                                a=mid+1;

                     elseb=mid-1;

           }

           if(a>b)

                     printf("无此元素");

           return0;

}

 

 

 

原创粉丝点击