[英]Ternary search in C
我想对C中的整数进行三进制搜索...我已经尝试过了...但是在某些情况下它不能很好地工作。 请帮助我删除以下程序中的错误-
我的尝试:
#include<stdio.h>
#include<conio.h>
void tsearch(int *a,int i,int j,int k);
main() {
int a[30],n,i,k;
printf("\nEnter n:");
scanf("%d",&n);
printf("\nEnter nos in ascending order:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("Enter no to search:");
scanf("%d",&k);
tsearch(a,0,n-1,k);
getch();
}
void tsearch(int *a,int i,int j,int k) {
int m1,m2;
m1=(i+j)/3;
m2=2*(i+j)/3;
if(k==a[m1])
{
printf("\nno found at %d",m1);
return;
}
else if(k==a[m2])
{
printf("\nno found at %d",m2);
return;
}
if(k<a[m1])
return(tsearch(a,i,m1-1,k));
if(k>a[m2])
return(tsearch(a,m2+1,j,k));
else
return(tsearch(a,m1+1,m2-1,k));
}
(仅)如果要搜索的数字出现在(数组的)最后2-3个位置之一中,则终止。 我犯了错的地方???
中点计算是错误的。 您拥有的方式是,m1和m2不在i和j之间。
尝试
m1 = i + (j - i) * 1 / 3;
m2 = i + (j - i) * 2 / 3;
@uncleo很好-并提供了不错的解决方案。
但是,更大的问题是,如果您搜索数组中没有的数字,则没有什么可以阻止递归-递归一直持续到崩溃为止。
另外, tsearch()
的设计tsearch()
怀疑; 显示的代码说这是一个无效函数,但是您使用return(tsearch(...));
几次(以及几次简单的return;
陈述)。 当然,该函数应该返回一个int
和两个普通return;
语句应返回m1
还是m2
? 您还需要处理范围退化的情况( i >= j
),这意味着该值不存在-也许您可以返回-1或类似的值。
#include<stdio.h>
int tsearch(int *a,int i,int j,int k);
int main() {
int a[10]={1,2,3,4,5,6,7,8,9,10};
int search;
int k;
printf("enter no to be searched :");
scanf("%d",&k);
search=tsearch(a,0,9,k);
printf("\n%d",search);
return 0;
}
int tsearch(int *data, int left, int right, int value){
int i;
int first,second;
if(left>right)
return -1;
i= (right - left)/3;
if(i==0) i++;
first = i + left -1;
second = i*2 + left - 1;
if(data[first]==value)
return first;
else
if(data[first]>value)
return tsearch(data, left, first-1, value);
else
{
if(data[second]==value)
return second;
else
if(data[second]>value)
return tsearch(data, first+1,second-1, value);
else
return tsearch(data, second+1,right, value);
}
}
int a[30],n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
这是一个典型的缓冲区溢出问题。 分配内存的a
动态的,一旦你知道什么n
是。 叔叔很好地解决了您的问题。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.