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.
Vamos tentar usar o método de divisão e consquista. Vamos supor que temos os seguintes vetores:
1 2 3 4 5 6 7 1 2 3 5 8 9 9
É claro que a mediana deles é 4 e 5. Vamos pegar a mediana do vetores:
1 2 3 (4) 5 6 7 1 2 3 (5) 8 9 9
O vetor em qual a mediana for menor deve ser aquele em que vamos pegar a parte da direita, o que a mediana for maior pegamos a da esquerda.
4 5 6 7 -> 4 (5) 6 7 -> 4 5 -> (4) 5 -> 4
1 2 3 5 -> 1 2 (3) 5 -> 3 5 -> 3 (5) -> 5
Na nossa função vamos ter dois vetores v1 e v2 com n elementos. Suponha que 3/2 = 1
Mediana(v1, v2, p1, q1, p2, q2)
1. se q1-p1 = 0
2. retorna v1[p1]
3.
4. j1l <- (q1-p1)/2
5. j2l <- (q2-p2)/2
6. j1u <- (q1-p1+1)/2
7. j2u <- (q2-p2+1)/2
8.
9. tmpv1 <- v1[j1l] + v1[j1u]
10. tmpv2 <- v2[j2l] + v2[j2u]
11.
12. se tmpv1 > tmpv2
13. retorna Mediana(v1, v2, p1, j1l, j2u, q2)
15. senão
16. retorna Mediana(v1, v2, j1u, q1, p2, j2l)