A função vai receber o vetor C que possi n elementos.
OrdenaAB(C, n)
1. dir <- 1
2. esq <- n
3. enquanto dir < esq
4. se C[dir] igual 'A'
5. dir <- dir + 1
6 senão se C[esq] igual 'B'
7. esq <- esq + 1
8. senão
9. C[esq] <-> C[dir]
10. dir <- dir + 1
11. esq <- esq + 1
Note que em cada interação obrigatoriamente dir vai ser subtraído ou esq vai ser adicionado. Com isso o número máximo de vezes que a linha 3 pode ser executada é $O(n)$. Note que as linhas posteriores a essa vão ser executadas menos vezes que essa, portanto o código continuará $O(n)$.
OrdenaZero(v, n)
1. dir <- 1
2. esq <- n
3. enquanto dir < esq
4. se C[dir] <= 0
5. dir <- dir + 1
6 senão se C[esq] > 0
7. esq <- esq + 1
8. senão
9. C[esq] <-> C[dir]
10. dir <- dir + 1
11. esq <- esq + 1
Não faz muito sentido exigir que j esteja em p..r, pois pense no caso em que temo o vetor completo de números negativas, nesse caso se j estiver em p..r, algum desses elemntos será > 0, criando uma contradição.
Para trocarmos v[j..r] > 0 por v[j..r] ≥ 0 basta alterar a linha 6 do programa. No entanto não faz sentido exigir que v[j] seja 0, pois dessa forma nunca saberíamos em qual parte do vetor encontramos os zeros.