二分法查找

作者在 2013-09-20 19:20:59 发布以下内容

//数据结构之二分法---适用于有序线性(顺序存储结构)表(其思想类似于在英语字典中查找一个单词)
#include<stdio.h>
void main()

   int half_search(int*,int,int);      //函数声明
   int t,count;
   int a[]={1,4,6,9,28,56,80,89,99,104,110,123,135,150};    //一个预设置的有序线性表,下面用二分法查找28的下标
   count=sizeof(a)/sizeof(int);      //获得数组中元素的个数    sizeof()返回对象所占用的字节大小
   //----------------------------------------------------------
   printf("please input the num you want to search:\n");
   scanf("%d",&t);                       //格式化输入
   t=half_search(a,count,t);   //在传递一个数组名到一个函数中时,它会完全退化为一个指针,也就是说
   //若定义  int *p=a, 则sizeof(p)=4,p是指向整型变量指针,sizeof 获得的是一个指针之所占的空间,应该是
   //长整型(long型)的,所以是4,这也就是为什么我们每次调用子函数处理数组时,都要指定数组的大小。

   if(t==-1) printf("\nsorry,no such num!\n");
   else         printf("\nok,the suffix is %d\n",t);
   return;
}
int  half_search(int *a,int count,int t)   //二分法查找
{
   int i,pre,next;
   pre=0;next=count-1;    //首尾赋值
   i=(pre+next)/2;                     //整除取中间
   if(t==a[0])        return 1;
   if(t==a[count-1])    return count;
   if(t>a[0]&&t<a[count-1] )
  while (1)
  {
    if(a[i]<t)
    {
    pre=i;
          if (i==next-1)  return -1;//当i和(pre或next)相邻时(即查找长度为0时)查找结束
       i=(next+i)/2;
    printf("up\t");
    }
       else if(a[i]>t)
    {
       next=i;
          if (i==pre+1)   return -1;
    i=(pre+i)/2;
    printf("down\t");
    }
       else return  i+1;
  }
   else return -1;
}

C | 阅读 1711 次
文章评论,共0条
游客请输入验证码