分治法与折半搜索算法

来源:互联网 发布:软件行为分析 编辑:程序博客网 时间:2024/06/07 06:20
/***分治法:折半搜索算法   int* binary_search(int *p,int *q,int key);要求数组已经排序。**1 Divide: 取中间节点r,分成两个数组[p,r),[r,q)**2 Conquer: 判断*r和key的大小,若*r==key 返回,若*r>key,递归处理[p,r),否则递归处理[r+1,q)**3 Combine: do nothing**特别注意递归终止的条件**算法复杂度:    T(n)=T(n/2)+θ(1);a=1,b=2 n^logbA=1   而f(n)=θ(1),所以T(n)=θ(lg n)  查看主方法的介绍。*/int* binary_search(int *p,int *q,int key);  int* binary_search(int *p,int *q,int key)  {    /*  if(q==p+1)    //说明p指向最后一个元素这段代码可以去掉,分析为啥    {          if(*p==key)              return p;          return NULL;    //最后一个元素都不与key相等,说明没有找到      }  */    if(q==p)//说明p已经指向最后一个元素的后面了,即没有找到。          return NULL;            int *r=p+(q-p)/2;    //r指向数组的中间位置      int *result;      if(*r==key)          result=r;      else if(*r>key)        //关键词有可能在r的左边          result=binary_search(p,r,key);      else    //关键词有可能在r的右边          result=binary_search(r+1,q,key);      return result;      }  void BubbleSort(int *array,int n)  {      int i;      int *p=array;      for(i=0;i<n;i++)      {          for(p=array;p<array+n-1;p++)          {              if(*p>*(p+1))    //交换*p 和*(p+1)              {                  *p=*p^*(p+1);                  *(p+1)=*p^*(p+1);                  *p=*p^*(p+1);              }          }      }  } int _tmain(int argc, _TCHAR* argv[]){    printf("please input 5 numbers:\n");      int num[5];      int i;      for(i=0;i<5;i++)          scanf("%d",num+i);            //need to change      printf("\nthe numbers are:\n");      for(i=0;i<5;i++)          printf("%d ",num[i]);            //need to change      printf("\n");  //    merge_sort(num,5);  //    merge_sort(num,num+5);      BubbleSort(num,5);      printf("afer sort the numbers are:\n");      for(i=0;i<5;i++)          printf("%d ",num[i]);            //need to change      printf("\n");         int key=4;      int *p=binary_search(num,num+5,key);      if(p==NULL)          printf("%d not found\n",key);      else          printf("find %d\n",*p);  getchar();getchar();return 0;}

原创粉丝点击