Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的三元搜索_C_Search - Fatal编程技术网

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

我想用三元搜索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));
}   
#包括
#包括
无效搜索(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;i
inta[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);
     }
}