C语言中的三元搜索
我想用三元搜索C中的整数。。。我已经试过了…但在特殊情况下效果不好。请帮助我删除以下程序中的错误-- 我的尝试:C语言中的三元搜索,c,search,C,Search,我想用三元搜索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
#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));
}
#包括
#包括
无效搜索(int*a,int i,int j,int k);
main(){
int a[30],n,i,k;
printf(“\n输入n:”);
scanf(“%d”和“&n”);
printf(“\n按升序输入编号:”);
对于(i=0;i来说,中点计算是错误的。按照你的方式,m1和m2不在i和j之间
试一试
中点的计算是错误的。按照你的方法,m1和m2不在i和j之间
试一试
inta[30],n,i;
scanf(“%d”和“&n”);
对于(i=0;iinta[30],n,i;
scanf(“%d”和“&n”);
对于(i=0;i),uncleo提出了一个很好的观点,并提供了一个不错的解决方案
不过,更大的问题是,如果搜索数组中不存在的数字,就没有什么可以阻止递归——它会一直持续到崩溃
另外,tsearch()
的设计是可疑的;显示的代码表明它是一个无效函数,但是您使用了几次return(tsearch(…);
以及两个普通的return;
语句)。当然,函数应该返回一个int
,两个普通的返回;
语句应该返回m1
或m2
?您还需要处理范围退化的情况(i>=j
)这意味着该值不存在-对于这种情况,您可以返回-1或类似的值。@uncleo提出了一个很好的观点-并提供了一个不错的解决方案
#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);
}
}
不过,更大的问题是,如果搜索数组中不存在的数字,就没有什么可以阻止递归——它会一直持续到崩溃
另外,tsearch()
的设计是可疑的;显示的代码表明它是一个无效函数,但是您使用了几次return(tsearch(…);
以及两个普通的return;
语句)。当然,函数应该返回一个int
,两个普通的返回;
语句应该返回m1
或m2
?您还需要处理范围退化的情况(i>=j
)这意味着该值不存在-对于这种情况,您可以返回-1或类似的值。\include
#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 tsearch(int*a,int i,int j,int k);
int main(){
inta[10]={1,2,3,4,5,6,7,8,9,10};
整数搜索;
int k;
printf(“输入要搜索的编号:”);
scanf(“%d”和“&k”);
搜索=t搜索(a,0,9,k);
printf(“\n%d”,搜索);
返回0;
}
int-tsearch(int*数据、int左、int右、int值){
int i;
int第一,第二;
如果(左>右)
返回-1;
i=(右-左)/3;
如果(i==0)i++;
第一个=i+左-1;
秒=i*2+左-1;
if(数据[第一]==值)
先返回;
其他的
if(数据[第一]>值)
返回tsearch(数据,左,第一个-1,值);
其他的
{
if(数据[秒]==值)
返回第二;
其他的
if(数据[秒]>值)
返回tsearch(数据,第一个+1,第二个-1,值);
其他的
返回tsearch(数据,秒+1,右,值);
}
}
#包括
int tsearch(int*a,int i,int j,int k);
int main(){
inta[10]={1,2,3,4,5,6,7,8,9,10};
整数搜索;
int k;
printf(“输入要搜索的编号:”);
scanf(“%d”和“&k”);
搜索=t搜索(a,0,9,k);
printf(“\n%d”,搜索);
返回0;
}
int-tsearch(int*数据、int左、int右、int值){
int i;
int第一,第二;
如果(左>右)
返回-1;
i=(右-左)/3;
如果(i==0)i++;
第一个=i+左-1;
秒=i*2+左-1;
if(数据[第一]==值)
先返回;
其他的
if(数据[第一]>值)
返回tsearch(数据,左,第一个-1,值);
其他的
{
if(数据[秒]==值)
返回第二;
其他的
if(数据[秒]>值)
返回tsearch(数据,第一个+1,第二个-1,值);
其他的
返回tsearch(数据,秒+1,右,值);
}
}
请更具体一点:终止时是否有错误消息?复制错误的输入是什么?否。它直接终止而不给出任何错误消息(其运行时错误)…&我正在使用DEVcpp编译器…如果假设我的数组是:1 4 5 7 8 9…n如果我将要搜索的输入键设为8或9..那么它将被终止…请更具体地说:终止时是否有错误消息?复制错误的输入是什么?否..它直接终止而不给出任何错误消息(其运行时错误)…&我正在使用DEVcpp编译器…如果假设我的数组是:1 4 5 7 8 9…n如果我将要搜索的输入键设为8或9…那么它将被终止…另外,从风格上讲,为什么要使用'big else'子句而不是继续使用'else if(data[second]==value)“…”?另外,您还没有决定在“if(…)”中的“if”之后是否应该有空格;请确定答案是“是的,那里应该有空格”。它是固定的。它还与“if(left>=right)return-1;”一起工作。另外,从文体上讲,为什么您要使用“big else”子句,而不只是继续使用“else if if”(data[second]==value)…..?另外,您还没有决定在if(…)中的if之后是否应该有空格;请确定答案是“是的,那里应该有空格”。它是固定的。它还与if(left>=right)return-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);
}
}