/*
**分治法:折半搜索算法 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;
}
分治法与折半搜索算法
最新推荐文章于 2021-10-28 22:40:45 发布