关于查询 (顺序查询与二分查询)

1.     问题

写出两种检索算法:在一个排好序的数组T[1..n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0

2.     解析

这个问题很好想到暴力,就是一个一个查找过去,这个可以用于顺序表存储得到数组,也可以用于链表存储的链表。

同时观察一下这是一个排好序的数组,那么我们也能很容易的想到二分查找,对于每一次的查找,都对半,去找中间的值,如果所要查找的x比我所得的中间值,要小,我就将右边界缩小,如果相等,就退出,如果大,就将左边界扩大,持续下去,直到找到,或者左边界的值要比右边界的值大时(说明没找到)就退出。

3.     设计

顺序查找的伪代码:

           for(i=1;i<len;i++){

               if(a[i]==x){

                   print(i)

                   break;

               }

           }

二分查找的伪代码:

           l=1,r=n;

           while(l<=n){

               mid= (l+r)/2

               if(a[mid]==x){

                   printf(mid);

                   break;

               }

               if(a[mid]<x){

                   l=mid+1

               }

               else r=mid-1

           }    

4.     分析

顺序查找的时间复杂度为O(n),二分查找的时间复杂度为O(logn).

5.     源码

kitalekita/binary_search.cpp at main · kitalekita/kitalekita (github.com)

kitalekita/brute_search.cpp at main · kitalekita/kitalekita (github.com)

原文地址:https://www.cnblogs.com/kitalekita/p/14587846.html