БАГ в quicksearch (bug)

 
int CArrayString::QuickSearch(const string element) const
  {
   int    i,j,m=-1;
   string t_string;
//--- search
   i=0;
   j=m_data_total-1;
   while(j>=i)
     {
      //--- ">>1" is quick division by 2
      m=(j+i)>>1;
      if(m<0 || m>=m_data_total) break;
      t_string=m_data[m];
      if(t_string==element) break;
      if(t_string>element)  j=m-1;
      else                  i=m+1;
     }
//---
   return(m);

  }


Итак что мы имеем? Если размер массива 1, и в нем нету строки, вместо -1 функйция возвращаяет 0, то есть как будто бы то что мы искали найдено в массиве на позиции 0.

Из за этого все алгоритмы у меня встали, потому что сначала надо в массиве проверить поиском, и если найдено то ничего не делать, а если не найдено то добавлять. И это важно, потому что даже если массив с размером 1, мы должны точно знать соответствует ли эта единственная строка тому что мы искали или нет.

итак что происходит, после деления (0+0)/2 ----> m равна 0, строка больше или меньше элемента, j или i меняется, как будто функция продолжалась бы дальше, а нет. Уже условие while(j>=i) не выполняется, в итоге возвращается последняя m, которая после деления была равна 0, и в этом ошибка!

Если не верите, сами проверьте.

Чтобы продемонстрировать, я сделал временное решение, которое исправляет эту проблему:

      if(t_string>element) 
      {
        j=m-1;
        if (j>=i) {}
        else {m=-1;};     
      }
      else  
      {
         i=m+1;
         if (j>=i) {}
         else {m=-1;};     

     }

Но это конечно же дурацкое решение, а нужно переписывать алгоритм, может если кто сталкивался, покажите плиз как можно переписать этот алгоритм более эффективно?

 
sarged:

Но это конечно же дурацкое решение, а нужно переписывать алгоритм, может если кто сталкивался, покажите плиз как можно переписать этот алгоритм более эффективно?

Если ответа в этой ветке не будет, посоветую обратиться  в сервисдеск на предмет того "это так задумано или баг?"; обстоятельно, без эмоций описать проблему и далее - по ситуации.
 
sarged:

Так и задумано. Метод QuickSearch(...)  организует "нечёткий" поиск. Это нужно для тог чтобы работали методы SearchGreat(...), SearchLessOrEqual(...) и др.

Чтобы наверняка определить наличие заданной строки используйте Search(...)