C排序说明和麻烦

时间:2016-01-27 20:31:12

标签: c sorting

我在解决这个问题时遇到了麻烦。我应该排序然后搜索一个数组(通过二进制搜索),但我在如何获得我认为的数组大小方面遇到了麻烦。

int binarySearch( int Arr[], int value)
{
  int low = 0;
  int high =sizeof(Arr)/sizeof(int);
  int mid = (low+high)/2;

  printf("%d\n",high);
  while (low <= high && Arr[mid] != value)
    {
      if( Arr[mid] < value)
        {
          low = mid+1;
        }
      else
        {
          high = mid-1;
        }
      mid = (low+high)/2;
    }
  if (low > high)
    {
      mid= -1;
    }
  return mid;
}


int main()
{
  BubbleSort( Array, 10);
  int pos = binarySearch(Array, 3);
  printf("The sorted array is: ");
  PrintArray( Array, 10);
  printf("\n");
  printf("Now lets look for number 3\n");
  printf("The number was located in space %d\n", pos);
  PrintArray( Array, 10);
}

但我一直得到的是:

 ./search
2 \\This is where I wanted to see what I was getting as the size of my array, 2???
The sorted array is: 0 1 2 3 4 5 6 7 8 9
Now lets look for number 3
The number was located in space -1
0 1 2 3 4 5 6 7 8 9

2 个答案:

答案 0 :(得分:4)

在作为函数参数的数组上使用sizeof将无法按预期工作。

当一个数组传递给一个函数时,它会衰减到一个指向数组第一个元素的指针。

所以这个:

int binarySearch( int Arr[], int value)

与此相同:

int binarySearch( int *Arr, int value)

sizeof(Arr)与调用sizeof(int *)相同。

您需要将数组的大小作为单独的参数传递给您的函数。

答案 1 :(得分:2)

其他人对sizeof所说的话是正确的......但还有更多信息binarySearch需要完成其工作:

int binarySearch( int Arr[], int low, int high, int value)
{
   int mid = (low+high)/2;
   ...

最初称为

binarySearch (Array, 0, 9, 3);

或更好

binarySearch (Array, 0, SIZE-1, 3);

这是因为二进制搜索并不总是从0开始,并不总是在数组的末尾结束。

另请注意,last,即最后一项的位置,不是数组的大小,而是一个,因为C ++的基于0的计数。

再看看如何执行此操作,请参阅此页面,向下滚动到C ++部分(在这种情况下,其代码可以编译为C编译):http://www.algolist.net/Algorithms/Binary_search