分治法与折半搜索算法
来源:互联网 发布:软件行为分析 编辑:程序博客网 时间: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;}