[Prévia cron] [Próxima Cron] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto] [Índice de autor]

erro?





    Estava lendo as notas de aula do prof. Paulo Feofiloff sobre
Quicksort, quando me deparei com essa função no exercçio número 2:


#define troca(X, Y) { int t = X; X = Y; Y = t; }

          int particione (int a[], int l, int r) {
             int v = a[r], i = l, j = r-1;
             while (i <= j) {
                if (a[i] < c) ++i;          /*  aqui eu ahco que é v e
não c */
                else if (v < a[j]) --j;
                else {
                   troca (a[i], a[j]);
                   ++i; --j;
                }
             }
             // agora i == j+1
             troca (a[i], a[r]);
             return i;
          }

         Eu li esse trecho de código e não concordei com o comentário
que o prof. fez:  // agora i == j+1.
Olha só porque eu acho isso: se por um momento i == j, o programa vai
rodar o corpo do laço while. E se além de i == j tivermos que a[i] == v,
vamos ter que os dois if aninhados serão falsos  ( v < v no primeiro e v
< v no segundo ) e então o corpo do else do segundo if irá rodar. Após o
fim dessa iteração do while, i == j +2, portanto o programa deixa o
while pra trás e chega no ponto onde o comentário foi feito com valores
de i e j diferentes do que o comentário afirma.
        Será que o que pensei tem está certo ou eu perdi alguma coisa?
Desculpe se ficou meio confusa minha explicação.