有序表的查找-折半查找

折半查找定义:先确定待查找记录所在范围,然后逐步缩小范围直到找到或找不到记录为止

low,high 分别为待查找范围的上界和下界,指针mid指示区域的中间位置,折半查找的范围其实就是用mid不断更新low或者high的位置,直到找到目标值,注意查找之前需要确保表是有序的

mid=(low+high)/2

设目标值为key;当key

                           当key>mid时,则更新low=mid+1;此时范围为[mid+1,high]

当low>high时 则查找失败;

C语言实现折半查找:

int binary_search(int[] a,int key){

      int low=0;

      int high=sizeof(a)/sizeof(a[0])-1;

      int mid=(low+high)/2;

     while(low<=high){

       if(a[mid]

          low=mid+1;

         }else if(a[mid]>key){

          high=mid-1;

     }else {

     return a[mid];

    };

  mid=(low+high)/2;

   }

     return -1;

}

折半查找的效率分析:

折半查找过程可以看做是一个二叉树,因此折半查找成功进行比较的关键字个数最多不超过树的深度;故折半查找在查找成功时和给定值进行比较的关键字个数不超过 log(2底数)n+1;

平均长度:

h=log2(底数)n+1;

ASL=1/n(1*2^(1-1)+2*2^(2-1)+...+j*2^(j-1)+h*2^(h-1))=((n+1)log2(底数)(n+1)/n)-1 其中j为第j层,也为查找到j层的已经比较过的关键字个数, 2^(j-1)为第i层的结点数j*2^(j-1)为第j层所有节点点的查找个数之和

当n>50时

ASL=log2(底数)(n+1)-1;

 

 

你可能感兴趣的:(有序表的查找-折半查找)