Ir para o conteúdo

Aula 29 - Ordenar vetor sem alterar o vetor original

Questão#

Uma empresa possui 10 funcionários e deseja ter um maior controle de suas vendas, então ela deseja ter um ranking de seus funcionários. Portanto seu programa deve receber o ID do funcionário e o total de vendas deste funcionário e, então mostrar na tela o ranking.

$ Digite o ID: 0
$ Informe o valor total: R$ 0
$ Digite o ID: 1
$ Informe o valor total: R$ 1
$ Digite o ID: 2
$ Informe o valor total: R$ 2
$ Digite o ID: 3
$ Informe o valor total: R$ 3
$ Digite o ID: 4
$ Informe o valor total: R$ 4
$ Digite o ID: 5
$ Informe o valor total: R$ 5
$ Digite o ID: 6
$ Informe o valor total: R$ 6
$ Digite o ID: 7
$ Informe o valor total: R$ 7
$ Digite o ID: 8
$ Informe o valor total: R$ 8
$ Digite o ID: 9
$ Informe o valor total: R$ 9

ID: 9 Valor: 9
ID: 8 Valor: 8
ID: 7 Valor: 7
ID: 6 Valor: 6
ID: 5 Valor: 5
ID: 4 Valor: 4
ID: 3 Valor: 3
ID: 2 Valor: 2
ID: 1 Valor: 1
ID: 0 Valor: 0

Solução#

Para resolver este problema vamos começar com a solução mais simples e depois vamos melhorar ela.

Solução 1#

solucao1.alg
algoritmo "ranking"

var
    vet: vetor[0..9] de real
    i, j: inteiro
    temp: real

inicio
    para i de 0 ate 9 faca
        escreva("Digite o ID:")
        leia(j)
        escreva("Informe o valor total: R$ ")
        leia(vet[j])
    fimpara

    para i de 0 ate 9 - 1 faca
        para j de i + 1 ate 9 faca
            se vet[j] > vet[i] entao
                temp <- vet[i]
                vet[i] <- vet[j]
                vet[j] <- temp
            fimse
        fimpara
    fimpara

    para i de 0 ate 9 faca
        escreval("ID: ", i, " valor:", vet[i])
    fimpara
fimalgoritmo

Aviso

Observe que esta solução tem o problema grave de alterar o dado original. Note que a saída dada por este programa diz que o funcionário com ID 0 foi o que mais vendeu, mas na verdade foi o funcionário com ID 9 que mais vendeu.

Solução 2#

Para não alterar o valor original nós vamos utilizar um vetor auxiliar que servirá de índice de ordenação do vetor original. Para ficar mais claro vamos ver um exemplo:

Digamos que os valores abaixo sejam do vetor original vet

índice valor
1 1,00
2 2,00
3 3,00

E o vetor auxiliar rank que será o índice de ordenação do vetor original vet

índice valor
1 1
2 2
3 3

Agora se nós acessarmos os elementos do vetor original vet através do vetor auxiliar rank (vet[rank[i]]) nós teremos o seguinte resultado:

I rank[i] vet[rank[i]]
1 1 1,00
2 2 2,00
3 3 3,00

Mudando um poucos os valores do rank[i] veja como o resultado muda e como o vetor original vet não é alterado:

I rank[i] vet[rank[i]]
1 2 2,00
2 1 1,00
3 3 3,00

E por fim, pensando no vetor ordenado temos o seguinte:

I rank[i] vet[rank[i]]
1 3 3,00
2 2 2,00
3 1 1,00

Agora que já vimos como funciona vamos ver como implementar isso no nosso programa.

solucao2.alg
algoritmo "ranking"

var
    vet: vetor[0..9] de real
    rank: vetor[0..9] de inteiro
    i, j, temp: inteiro

inicio
    para i de 0 ate 9 faca
        escreva("Digite o ID:")
        leia(j)
        escreva("Informe o valor total: R$ ")
        leia(vet[j])
        rank[i] <- i
    fimpara

    para i de 0 ate 9 - 1 faca
        para j de i + 1 ate 9 faca
            se vet[rank[j]] > vet[rank[i]] entao
                temp <- rank[i]
                rank[i] <- rank[j]
                rank[j] <- temp
            fimse
        fimpara
    fimpara

    para i de 0 ate 9 faca
        escreval("ID: ", rank[i], " valor:", vet[rank[i]])
    fimpara
fimalgoritmo

Aula em vídeo#

Caso prefira também existe o conteúdo em forma de vídeo

Desafios#

Caso queira treinar um pouco mais você pode ver o(s) seguinte(s) enunciado(s):