2016-05-09 4 views
-3

Я пытался понять это весь день и не могу заставить его работать. Почему мой двоичного поиска работы, если я ввод длину массива вручную, но когда я поменять ручной ввод для:Binary Search Int Array Size Issue

int max = sizeof(list)/sizeof(list[0]); 

это не похоже на работу. Например, если я попытаюсь найти 2 в массиве из 11 элементов из 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, он не сможет найти 2. Но если я изменю int min = 11. Он может найти 2. Вот функция бинарная сортировка:

int binarysearch(int *list, int sfor) 

    int min = 0; 
    int max = 10; 
    int mid = (min + max)/2; 

    while(min <= max) 
    { 
     if (sfor == list[mid]) 
     { 
      printf("The number you are searching for is in %i place \n", mid + 1); 
      return 0; 
     } 
     else if (sfor < list[mid]) 
     { 
      max = mid - 1; 
     } 
     else 
     { 
      min = mid + 1; 
     } 

     mid = (min + max)/2; 
    } 

     printf("Could not find number! \n"); 
     return 1; 



int main(int argc, string argv[]) // number searching for is passed through 
{         // command line argument 

    printf("How many numbers did you want to search through? \n"); 
    int a = GetInt(); //int a is how big should the array of numbers be 
    printf("What are they: \n"); 

    int i = 0; 
    int b[a]; 

    for (i = 0; i < a; i++) 
    { 
     b[i] = GetInt(); //cycles though each int of the array 
    } 

    int x = atoi(argv[1]); //converts command line argument to an int 

    binarysearch(b, x); 
} 

будет очень признателен за любую помощь.

+2

Как определить "список"? 'int * list;'? –

+0

Научитесь отлаживать свой код. Распечатайте значение min и проверьте правильность или нет. – user31264

+0

Когда я отлаживаю свой код, он говорит max = 2, но если длина массива равна 11, то как int max = sizeof (list)/sizeof (list [0]); получить 2? –

ответ

0

Ваша проблема здесь:

int min = sizeof(list)/sizeof(list[0]); 

Это не будет работать для массивов, переданных функций (так как вы не можете фактически передать массив в функцию). Вы также должны передать размер массива.

+0

Это не «трюк», а нормальное и юридическое выражение. И причина, по которой это не работает, заключается в том, что вы не можете передать массив функции в C. Последнее предложение просто неверно. – Olaf

+0

@Olaf Как это неправильно? Это не сработает, если вы объявите массив в одном месте, а затем передадите его другой функции, потому что, как вы заявляете, вы не можете этого сделать. Кроме того, он работает только тогда, когда их размер известен во время компиляции, поскольку sizeof не является функцией, а макросом. – bodangly

+0

@Olaf Я отредактировал свой ответ, чтобы быть более ясным и удалил трюк слова (хотя я утверждаю, что это не рекомендуется делать в любом случае. Вы всегда должны знать размер вашего массива, независимо от того, выделяете ли вы его во время выполнения или компилируете время, этот размер должен быть захвачен где-то. Вам никогда не придется прибегать к этому методу, и я бы сказал, что это запах кода.) – bodangly