插值搜索程序?

时间:2013-03-30 20:12:07

标签: c search interpolation

当我输入一个大约200000的值时,它没有问题。但是,如果我搜索更大的价值计划,那么什么都不做。只需将一行向下传递并等待。这有什么问题?

#include<stdio.h>
#include<conio.h>
int isearch(int a[],int key);
int main()
{
  int arr[20000],n,i,key,mid;


  FILE *fptr;

  //read sorted list file!
  if((fptr = fopen("sorted.txt","r"))==NULL){
    printf("Error in reading file !\n");
    return 0;
  }
  //array of sorted list!
  while(!feof(fptr)){
    if(!feof(fptr)){
      fscanf(fptr,"%d",&arr[i]);
      i++;}

  }

  printf("\nEnter element to be found:");
  scanf("%d",&key);
  mid=isearch(arr,key);
  printf("\nFound at position %d",mid+1);
  getch();
  return 0;
}
int isearch(int a[],int key)
{
  int low=0,high=19999,mid;
  while(a[low]<key&&a[high]>=key)
  {
    mid=low+(high-low)*(key-a[low])/(a[high]-a[low]);
    if(a[mid]<key)
      low=mid+1;
    else if(a[mid]>key)
      high=mid-1;
    else
      return mid;
  }
  if(a[low]==key)
    return low;
  else
    return -1;
}

1 个答案:

答案 0 :(得分:0)

您的算法假设已设置a的所有值,但您不保证......如果您的文件少于20000个条目会怎样?

并且假设arr[19999]是100000,并且您搜索200000,mid将被设置为大于high的值,并且您将获得未定义的行为。您需要检查mid是否在low .. high内。为避免出现第一个问题,您应该将低和高参数传递给搜索函数(或者只是数组大小== high + 1,因为low始终为0)。

我建议查看在线和算法书籍中可用的插值搜索算法的众多示例中的任何一个。