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#
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.
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):