2014-01-10 2 views
2

Я написал код с функцией и использовал strcmp.I ввел 5 имен в программу (один из них - sara). И когда я их ищу, я могу найти все, но не сару. почему, когда я ищу сару, ее не найти?Двоичный поиск в c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void fbubble(char [][21],int); 
int fsearch(char [][21],char [],int); 
int main(int argc, char *argv[]) { 
    const int n=5; 
    int i; 
    char name[21],a[n][21]; 
    printf("enter 5 name\n"); 
    for(i=0;i<n;i++) 
     gets(a[i]); 
    fbubble(a,n); 
    printf("enter name to search\n"); 
    gets(name); 
    if(fsearch(a,name,n)==-1) 
     printf("name not exist in the table\n"); 
    else printf("name exist in the table\n"); 
     getch(); 
    return 0; 
} 
//********************************************** 
void fbubble(char a[5][21],int n){ 
    int i,j; 
    char temp[21]; 
    for(i=n-1;i>0;i--) 
     for(j=0;j<i;j++) 
      if(strcmp(a[j],a[j+1])>0){ 
       strcpy(temp,a[j]); 
       strcpy(a[j],a[j+1]); 
       strcpy(a[j+1],temp); 
      } 
} 
//********************************************** 
int fsearch(char a[5][21],char name[21],int n){ 
    int mid,low=0,high=n-1; 
    while(low<high){ 
     mid=(low+high)/2; 
     if(strcmp(name,a[mid])<0) 
      high=mid-1; 
     else if(strcmp(name,a[mid])>0) 
      low=mid+1; 
     else return mid; 
    } 
    return -1; 
} 
+1

Вы пробовали пропустить код в своем отладчике, чтобы узнать, что происходит? –

+1

Каковы имена, кроме имени 'sara', которые вы ввели? Какой порядок вы ввели имена? Вы распечатали массив имен до и после сортировки? Имя присутствует после сортировки? Сортируются ли данные после сортировки? Вы также должны сразу забыть, что функция 'gets()' когда-либо существовала и никогда не использует ее снова. Он больше не является частью стандарта C и слишком опасен для использования даже в коде с отбрасыванием. –

+0

Я пробовал отладчик, но ошибок не было. –

ответ

5

Это о вашем сравнении с высоким и низким

Давайте думать об этом логически

Мы

['ahmad','ali','masoud','reza','sara'] 
    0  1  2  3  4 

high = 4, low = 0, mid = 2

masoud != sara

low = mid+1 = 3

mid = 7/2 = 3

reza != sara

low = mid+1 = 4

high>low == false;break;

исправить:

Вы хотите while(low<=high)

Смежные вопросы