English 中文(简体)
C号门槛值
原标题:Ternary search in C
  • 时间:2009-09-06 06:15:09
  •  标签:

我想对C.的惯犯进行例行搜查。 我曾尝试过这件事......但对于特定案件来说,这并不好。 请帮助我从以下方案中删除这些 b子:

我的尝试:

#include<stdio.h>
#include<conio.h>
void  tsearch(int *a,int i,int j,int k);
main() {
  int a[30],n,i,k;
        printf("
Enter n:");
  scanf("%d",&n);
  printf("
Enter 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("
no found at %d",m1);
    return;
   }
  else  if(k==a[m2])
   {
    printf("
no 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个地点(阵列)中有一个地点(仅限)有待查人数,则终止。 谁犯了错误?

最佳回答

中点计算是错误的。 你们的手法是,每平方米1米和2米之间。

审判

 m1 = i + (j - i) * 1 / 3;
 m2 = i + (j - i) * 2 / 3;
问题回答

@uncleo是一个好点,提供了体面的解决办法。

然而,最大的问题是,如果你寻找阵列中的一定数目,就没有任何东西可以阻止重新入侵——它一直持续到它坠毁为止。

另外,<代码>tsearch()的设计也值得怀疑;所显示的代码称其为无效功能,但你使用<代码>return(tsearch(......));好几次(以及一对一 couple的<代码>return; statement)。 当然,该功能应当退回<代码>int和两个明晰的<代码>return; 报表应退回m1m2? 如果范围是异质(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("
%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 页: 1





相关问题
热门标签