有序的静态查找表的折半(二分)查找算法

 

/*折半查找(二分查找)
解题步骤:
1.将有序表(升序)存储在数组中。
2.定义三个指针low,high,mid。起初指针low指向了数组的首元素,指针high指向
数组的最后一个元素,指针mid指向low+(high-low)/2元素的地址。
下述分析情况:
0,1,2,3,4,5,6,7,8,9,10 奇数个数的情况: m所指向的元素的两边的元素相等
l         m         h
h-1/2=5
l+5=5
0,1,2,3,4,5,6,7,8,9 偶数个数的情况:m所指向的元素的右边的元素的个数比左边的元素的个数多一个
l       m          h
h-l/2=4;
l+4=4
3.将mid所指向的元素的值和要查找的元素的值key(key为可唯一标识一条记录的关键字)比较,若相等,
mid所指向的元素的为要查找的记录,若mid所指向的元素的值大于key,故可得出
推论key元素在mid所指向的元素的左边,因此,将指针high指向指针mid-1指向的位置,
令指针mid指向low+(high-low)/2所指向的位置,若若mid所指向的元素的值小于key,故可得出
推论key元素在mid所指向的元素的右边,因此,将指针low指向指针mid+1指向的位置,令指针mid指向
low+(high-low)/2所指向的位置。
4重复3,直到low和mid指向的位置相等时,若mid所指向的元素的值不等于key可知道不存在查找的记录
 
*/
 
#include <stdio.h>
#define LEN 11
 int * search(int *ptr,int size,int key);
int main(void)
{
    int arr[LEN]={5,13,19,21,37,56,64,75,80,88,92};
 
   if(search(arr,LEN,92)==NULL)
       printf("no record\n");
   else
    printf("%d\n",*search(arr,LEN,92));
     
 
 
    return 0;
}
//将指针high指向指针mid-1指向的位置
 int * search(int *ptr,int size,int key)
 {
     int *low,*high,*mid;
     low=ptr;
     high=ptr+size-1;
     mid=low+(high-low)/2;
     while(low<=high)
     {
         if(*mid==key)
            return mid;<br>          
        else if(*mid>key)
        {
            high=mid-1;
            mid=low+(high-low)/2;//high+low 指针的相加是不允许的因此mid=(high+low)/2错误表示方法
 
        }
        else
        {
            low=mid+1;
            mid=low+(high-low)/2;//词句重复出现两句,因此可将其放到return mid;语句之后
        }
     }
 
      return NULL;
 
 }
 /*将指针high指向指针mid指向的位置的情况
  int * search(int *ptr,int size,int key)
 {
     int *low,*high,*mid;
     low=ptr;
     high=ptr+size-1;
     mid=low+(high-low)/2;
     do
     {
         
        if(*mid==key)
            return mid;
        else if(*mid>key)
        {
            high=mid;
            mid=low+(high-low)/2;
 
        }
        else
        {
            low=mid;
            mid=low+(high-low)/2;
        }
        if(*mid==key)
            return mid;
 
 
     }while(mid!=low);
     if(*high==key)
         return high;
 
      return NULL;
 
 }
 */

  

posted @   创新突破游子恒心  阅读(328)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示