Você está na página 1de 161

DESENVOLVIMENTO WEB

Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

PROGRAMAÇÃO ESTRUTURADA

Em geral, nos editais cobram-se a programação estruturada orientada a objetivos, além


da programação funcional. O conteúdo dessa aula será focada na programação estruturada.

Bibliografia
O livro abaixo, escrito por brasileiros, muito utilizado em cursos acadêmicos, versa das
estruturas básicas e do uso de três linguagens: algoritmos, linguagem mais próxima do nosso
dia a dia; Java; C e C++; e Pascal.

Computação
Desde o início da existência do homem ele tem procurado criar máquinas que o auxiliem
em seus trabalhos, diminuindo esforços e economizando tempo.
No início, as máquinas eram produzidas para atividades físicas, iniciando-se, posterior-
mente, máquinas com atividades intelectual, tais como o desenvolvimento de calculadoras
mais remotas até computadores.
ANOTAÇÕES

1 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O computador é capaz de auxiliar em qualquer coisa que lhe seja solicitada, é consciente,
trabalha e possui muita energia, mas não tem iniciativa, nenhuma independência, não é cria-
tivo nem inteligente, e por isso precisa receber instruções nos mínimos detalhes (algoritmos).
Quanto ao “não é criativo nem inteligente”, é preciso tomar cuidado com a evolução das
máquinas e sistemas. Atualmente, com o machine learning as máquinas possuem uma capa-
cidade latente de aprendizado e simulação (aproximação) de inteligência.
5m
Para o computador realizar uma tarefa é preciso que haja uma linguagem que o oriente
a executar alguma atividade.

Processamento de Dados

O processamento é onde o computador entra. Exemplo: operação matemática com ope-


ração de dados: 1 + 1 (operandos); resultado de 1 + 1 é o processamento dos dados, dando
uma saída como resultado a operação, a saber, 2.

Algoritmos
O computador é composto por duas partes:
• Hardware: Partes físicas;
• Software: Programas.

Exemplo para memorizar: o hardware é o que se “chuta” – parte física; e o software é o


que se “xinga” quando se está com raiva – parte abstrata.
Quando queremos escrever um software para realizar determinado tipo de processa-
mento de dados, devemos escrever um programa e, para que o computador compreenda e
execute esse programa, devemos escrevê-lo usando uma linguagem que tanto o computador
quanto o desenvolvedor de software entendam (linguagem de programação).
Nos computadores mais remotos, antes da década de 50, o código era escrito em lingua-
gem de máquina, bem próximo ao que os processadores compreendiam. Obviamente que
os softwares ficam mais complexos, e com o passar das décadas os códigos começaram a
ANOTAÇÕES

2 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ser escritos em linguagens de alto nível. Diante dessa linguagem de alto nível, o computador
traduz em uma linguagem em que o usuário melhor possa compreender, algo chamado de
compilação.
As etapas para o desenvolvimento de um programa são:
1. Análise: estuda o enunciado do problema para definir os dados de entrada, o proces-
samento e os dados de saída. Ou seja, antes do processo de programação, serão realizadas
análises do problema, para que assim se possa checar os dados de entrada e saída.
10m
2. Algoritmo: utiliza ferramentas do tipo narrativa, fluxograma ou português estruturado
para descrever o problema com suas soluções.
3. Codificação: o algoritmo é transformado em códigos de linguagem de programação
escolhida para se trabalhar. Exemplo: Java, C, Python. Os algoritmos podem ser traduzi-
dos para qualquer uma dessas linguagens, cada qual com suas particularidades e objetivos
específicos.

• Um programa, que é o resultado final, é a codificação de um algoritmo (nível mais alto)


em uma determinada linguagem de programação.
• Um algoritmo é um conjunto de passos finitos que devem ser seguidos para que certo
objetivo seja alcançado.

Exemplo: algoritmo para remover a lâmpada queimada:


1. Posicione a escada debaixo da lâmpada;
2. Suba na escada até que a lâmpada possa ser alcançada;
3. Gire a lâmpada no sentido anti-horário, até que ela se solte;
4. Retire a lâmpada.

Para o ser humano, a leitura desse algoritmo é de fácil compreensão. Contudo, para o
computador, esse algoritmo está bastante abstrato, sendo de difícil compreensão.

Programação Estruturada
Programação estruturada é um paradigma de programação que visa melhorar a clareza,
qualidade e tempo de desenvolvimento de um programa de computador, fazendo uso exten-
sivo das estruturas de controle de seleção (SE / ENTÃO / SENÃO / CASO) e repetição (PARA
/ REPITA / ENQUANTO), estruturas de blocos e sub-rotinas.
ANOTAÇÕES

3 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A programação estruturada surge devido à crise de software (anos 50). Ou seja, perce-
beu-se que, quando se escrevia em código muito próximo ao que a máquina compreendia
ou sem tanta orientação, o código era de difícil manutenção. Neste interim, a programação
orientada surgir como uma série de orientação para desenvolver códigos de fácil manuten-
ção e com poucos problemas.
15m
O princípio básico de programação estruturada é que um programa é composto por
blocos elementares de código que se interligam através de três mecanismos básicos, que
são sequência, seleção e iteração. Cada uma destas construções tem um ponto de início
(o topo do bloco) e um ponto de término (o fim do bloco) de execução.

• Sequência: implementa os passos de processamento necessários para descrever


qualquer programa. O programa é executa em uma certa ordem lógica que o compu-
tador executa.
• Seleção: especifica a possibilidade de selecionar o fluxo de execução do processa-
mento baseado em ocorrências lógicas. Trata-se da possibilidade de haver uma ava-
liação de uma expressão lógica, observando um resultado final.

Exemplo: “Se chover, torna-se preciso levar o guarda-chuva. Se não chover, não se pre-
cisa levar o guarda-chuva”. Note que, diante das premissas, há orientações com base um
condições lógicas.

• Iteração: permite a execução repetitiva de segmentos do programa. Existe uma quan-


tidade de passos a serem aplicados com determinada lógica. Assim, uma série de
comandos serão executados de forma repetida, de acordo com determinada condição.

Em provas, as bancas podem cobrar questões muito conceituais. Daí a importância de


estudar os conceitos acima.

GO TO

Em 1968, Edsger W. Dijkstra, através do artigo "A Case against the GO TO Statement"
critica o uso excessivo do comando de desvio incondicional GOTO nos programas desenvol-
vidos na época.
ANOTAÇÕES

4 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Em geral, a cláusula GO TO não é vista como uma boa prática de programação.


A programação estruturada pressupõe a eliminação ou minimização do uso de GO TO.
Nessa época, a programação utilizava bastante o GOTO. Exemplo: mesmo com uma
sequência de instruções era possível retornar para outra orientação de forma arbitrária: “se
ocorrer o evento X, volte ao passo 2”.
Essa ação tornava o código de difícil manutenção. Diante disso, a programação estrutura
surge para dirimir esses problemas, por meio de estruturas para a utilização do GOTO.
20m

Variáveis

• Um programa, recebe dados que precisam ser armazenados no computador para que
possam ser utilizados no processamento;
• Este armazenamento é feito na memória;
• Quando uma operação aritmética recebe dois operandos, cada operando é armaze-
nado em um endereço de memória diferente, para ser utilizado no cálculo;
• Como cada endereço de memória pode armazenar dados várias vezes, ou seja, seu
conteúdo pode variar, chamamos estas posições de variáveis.

Exemplo comparativo: em equações matemáticas, o “x” costuma ser tido como


uma variável.

Identificadores
Representam os nomes das variáveis, dos programas, constantes, rotinas, entre outros.
Exemplo: f(x) é o mesmo que função, na matemática.

Regras básicas para formação de identificadores:


• Caracteres permitidos: números, letras maiúsculas ou minúsculas e o caractere
sublinhado "_";
• O primeiro caractere dever ser sempre uma letra ou o caractere sublinhado;
• Não são permitidos caracteres em branco e caracteres especiais;
• Não é possível utilizar palavras reservadas nos identificadores, ou seja, palavras que
pertencem à linguagem de programação utilizada linguagem de programação utilizada.
• Não é possível utilizar um comando. Exemplo: Comando “Se”.
ANOTAÇÕES

5 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Tipos de Dados
Os tipos de dados determinam quantos de memória uma determinada variável ocupará e
o tipo de conteúdo que será armazenado. Os mais comuns são:
25m

• Numérico: Representam números inteiros e decimais;


• Lógico: Representam dados booleanos (verdadeiro/falso);
• Literal ou Caractere: Representam cadeias de caracteres (strings).

Os tipos de dados variam muito de linguagem para linguagem, visto que algumas supor-
tam números complexos, inteiros, flutuantes, os tipos numéricos, os tipos booleanos e carac-
teres. De acordo com o tipo de dado diferente, um tanto mais de espaço será utilizado.

Estrutura Sequencial
Estrutura básica para algoritmos em pseudocódigo (ou portugol):
ALGORITMO
DECLARE
Bloco de comandos
FIM_ALGORITMO

Acima, o algoritmo começa com “ALGORITMO” e termina do “FIM_ALGORITMO”. Entre


estes há o bloco de código.

Declaração de Variáveis
Variáveis são declaradas após a palavra DECLARE, e os tipos mais utilizados são NUMÉ-
RICO LITERAL ou LÓGICO:
DECLARE
X – NUMÉRICO
Y, Z LITERAL

É importante atentar que, a depender da linguagem a se utilizar, algumas linguagens dife-


renciam maiúsculas de minúsculas.
ANOTAÇÕES

6 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Atribuição
30m
Utilizado para atribuir um valor ou operação à uma variável
Representado pelo símbolo "←":
X–←4
X–←X+2
Y ← "aula"

Em geral, é possível realizar operações com a próxima variável. Mas o resultado da ava-
liação será atribuído ao lado esquerdo da expressão: X + 2

Obs.: algumas linguagens utilizam comumente o sinal “=”.

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

7 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

PROGRAMAÇÃO ESTRUTURADA II

Comandos de Entrada e Saída (E/S)


No processamento, observa-se a entrada de dados, o processamento e a saída de dados.
Entrada e saída de informações são essenciais, pois sem elas o cálculo não poderá ser feito.

O comando de entrada é utilizado para receber dados informados pelo usuário. É repre-
sentado pela palavra LEIA:
LEIA X

O comando de saída é utilizado para mostrar dados para o usuário na tela do monitor.
Representado pela palavra ESCREVA:
ESCREVA Y

O “LEIA” será visto como o código de entrada e o “ESCREVA” será visto como o código
de saída de dados.

Estrutura Condicional (seleção)


Essa estrutura é conhecida também como estrutura de decisão ou de seleção, ela se
caracteriza pela execução de determinados códigos de programação dependendo da vera-
cidade de uma condição.

Exemplo: se chover, leve o guarda-chuva. O comando “leve o guarda-chuva” está subor-


dinado a uma condição. Já no caso do exemplo “se chover, leve o guarda-chuva. Se não
chover, leve o filtro solar”, observa-se um caso positivo e o comando do “SE + NÃO”.

Estrutura Condicional Simples


SE – condição
ENTÃO – comando

O “SE” é um booleano, sendo avaliado como TRUE ou FALSE.


ANOTAÇÕES

1 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O comando só será executado se a condição for verdadeira. Uma condição é uma com-
5m
paração que possui dois valores possíveis: verdadeiro ou falso.
SE condição
ENTÃO INÍCIO
comando1
comando2
comando3
FIM

Se a condição for verdadeira, serão executados o comando1, comando2 e comando3.


Exemplo: se chover, leve o guarda-chuva e a capa de chuva. O bloco começa com
INÍCIO e termina com FIM (a depender da literatura). Aqui, observa-se uma condição e diver-
sos blocos, sendo executados se a condição for verdadeira.

Estrutura Condicional Composta


SE condição
ENTÃO comando1
SENÃO comando2

Na estrutura composta, além do ENTÃO há o SENÃO. Exemplo: “Se chover, leve o


guarda-chuva, senão leve a capa de chuva.”

Se a condição for verdadeira, será executado o comando1, caso contrário, será execu-
tado o comando2.

SE condição
ENTÃO INÍCIO
comando1
comando2
SENÃO INÍCIO
comando3
comando4
FIM
ANOTAÇÕES

2 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Se a condição for verdadeira, serão executados o comando1 e o comando2, caso con-


trário, serão executados o comando3 e o comando4.

Da mesma forma que na estrutura condicional simples há blocos associados, na estru-


tura composta também se tem.

Exemplo
ALGORITMO
DECLARE N1, N2, M NUMÉRICO
ESCREVA "Digite as duas notas"
LEIA N1, N2
M ← (N1 + N2)/2
ESCREVA "Média = ", M
SE (M >= 7)
ENTÃO ESCREVA "Aprovado"
SENÃO ESCREVA "Reprovado"
FIM_ALGORITMO

 Obs.: no exemplo acima se observa a declaração da variável N1, N2 e M NUMÉRICO. O


comando ESCREVA apresentará uma tela no computador virtual para quem opera o
programa.

O comando “Digite as duas notas” buscará calcular a média aritmética. Após o resultado
da média aritmética, nota-se uma condicional, resultando no “Aprovado”, se verdadeiro, ou
10m “Reprovado”, se falso.

Aninhamento de estruturas de decisão


Todos os blocos podem ser aninhados.

SE condição1
ENTÃO comando1
SENÃO INÍCIO
SE condição 2
ENTÃO comando2
SENÃO comando3
FIM

3 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Acima, a estrutura de decisão do SENÃO INÍCIO está aninhada com a primeira estrutura
de decisão, ocorrendo apenas no caso do SENÃO.

Estruturas de decisão podem ser aninhadas com o objetivo que sejam verificadas várias
alternativas possíveis.

Qualquer outro tipo de bloco pode ser aninhado. E quanto mais blocos, um tanto mais de
aninhamento haverá, provocando uma maior complexidade.

SE IDADE > 10
ENTÃO ESCREVA "IDADE ACIMA DE 10 ANOS"
SENÃO INÍCIO
SE IDADE < 10
ENTÃO ESCREVA "IDADE MENOR DE 10 ANOS"
SENÃO ESCREVA "TEM EXATAMENTE 10 ANOS"
FIM

Havendo muitas estruturas de decisões distintas e aninhadas, nota-se uma grande difi-
culdade quanto ao código. Em vista disso, existe uma outra estrutura, a chamada “Estrutura
de seleção múltipla ESCOLHA-CASO”.

Estrutura de seleção múltipla ESCOLHA-CASO


A estrutura ESCOLHA-CASO (em inglês SWITCH-CASE), é uma alternativa quando se
tem várias estruturas de decisão aninhadas. Isto é, quando outras verificações são feitas
caso a anterior tenha falhado.

A proposta da estrutura ESCOLHA-CASO é permitir ir direto no bloco de código dese-


jado, dependendo do valor de uma variável de verificação.

ESCOLHA variável-de-verificação
CASO valor1 FAÇA
comando1
comando2
CASO valor2 FAÇA
comando3
comando4
...
FIM

4 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

No exemplo acima, caso o valor “CASO valor1 FAÇA” seja executado, o resultado será
15m “comando1” e “comando2”, e assim sucessivamente.

É possível inserir acima quantos blocos forem precisos, alocando-os um abaixo do outro.
Sobre essa informação, observe o exemplo abaixo:

ALGORITMO
DECLARE NUMERO1, NUMERO2, RESULTADO NUMÉRICO
OPERACAO : CARACTERE
ESCREVA "DIGITE O PRIMEIRO NÚMERO: "
LEIA NUMERO1
ESCREVA "DIGITE A OPERAÇÃO: "
LEIA OPERACAO
ESCREVA "DIGITE O SEGUNDO NÚMERO: "
LEIA NUMERO2
SE OPERACAO = "+" ENTAO RESULTADO ← NUMERO1 + NUMERO2
SENAO INICIO
SE OPERACAO = "-" ENTAO RESULTADO ← NUMERO1 - NUMERO2
SENAO INICIO
SE OPERACAO = "*" ENTAO RESULTADO ← NUMERO1 * NUMERO2
SENAO INICIO
SE OPERACAO = "/" ENTAO RESULTADO ← NUMERO1 / NUMERO2
FIM
FIM
FIM
ESCREVA "RESULTADO: ", RESULTADO
FIM_ALGORITMO

A depender da operação matemática que o usuário digitou, verificar-se-á o resultado no


código. Diante disso, é possível realizar vários aninhamentos de “SE”, mas o código ficará de
difícil leitura e manutenção.
ANOTAÇÕES

5 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Observe abaixo a mesma operação do exemplo acima com o ESCOLHA-CASO:

ALGORITMO
DECLARE NUMERO1, NUMERO2, RESULTADO NUMÉRICO
OPERACAO : CARACTERE
ESCREVA "DIGITE O PRIMEIRO NÚMERO: "
LEIA NUMERO1
ESCREVA "DIGITE A OPERAÇÃO: "
LEIA OPERACAO
ESCREVA "DIGITE O SEGUNDO NÚMERO: "
LEIA NUMERO2
ESCOLHA OPERACAO
CASO "+" FAÇA
RESULTADO ← NUMERO1 + NUMERO2
CASO "-" FAÇA
RESULTADO ← NUMERO1 - NUMERO2
CASO "*" FAÇA
RESULTADO ← NUMERO1 * NUMERO2
CASO "/" FAÇA
RESULTADO ← NUMERO1 / NUMERO2
FIM
ESCREVA "RESULTADO: ", RESULTADO
FIM_ALGORITMO

Caso não tratado na estrutura (OUTROCASO)


Existe uma opção a mais nessa estrutura, justamente para tratar quando o valor da vari-
ável não é equivalente a nenhum valor informado como opção nos CASOs, ou seja, é um
"OUTROCASO".

ESCOLHA operacao
CASO "+" FAÇA
resultado ← numero1 + numero2
CASO "-" FAÇA
ANOTAÇÕES

6 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

resultado ← numero1 - numero2


CASO "*" FAÇA
resultado ← numero1 * numero2
CASO "/" FAÇA
resultado ← numero1 / numero2
OUTROCASO
ESCREVA "Operação inválida"
FIM

O programa está se preparando para receber um valor não esperado. Assim, o


OUTRO-CASO envia uma mensagem para o usuário avisando-o que a mensagem não foi
20m compreendida.

DIRETO DO CONCURSO
1. (CESPE/EBC/ANALISTA/ADMINISTRAÇÃO DE SISTEMAS/2011) Em programação
estruturada, por meio do mecanismo de seleção, é possível testar determinada condi-
ção e estabelecer ações a serem realizadas.

COMENTÁRIO
Mecanismo de seleção é o mesmo que o “SE”.

Estruturas de Repetição
As estruturas de repetição são utilizadas nos casos onde determinados trechos dos algo-
ritmos precisarão ser executados mais de uma vez e, para que não seja necessário reescre-
ver trechos idênticos que aumentariam consideravelmente o tamanho do programa, utiliza-se
as estruturas de repetição.

No caso da seleção, havia um código em que se buscava a sua execução ou não a partir
de determinada condição por meio de uma seleção booleana. Já no caso de repetição, os
blocos de códigos se repetem até que uma condição seja atingida.
ANOTAÇÕES

7 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Estrutura de Repetição PARA


Esta estrutura de repetição é utilizada quando se sabe previamente o número de vezes
em que um trecho do algoritmo deve ser repetido:

PARA I ← valor_inicial ATÉ valor_final FAÇA


comando1

O comando1 será executado utilizando a variável I como controle, cujo conteúdo vai
variar do valor inicial até o valor final, de 1 em 1, incrementando automaticamente.

A estrutura PARA é utilizada quando se sabe previamente quantas vezes se busca repetir
o código.

Ela pode também ser utilizada com blocos, podendo ainda ter um número arbitrário
de comandos:

PARA I ← valor_inicial ATÉ valor_final FAÇA


INÍCIO
comando1
comando2
FIM

O comando1 e o comando2 serão executados utilizando a variável I como controle, cujo


conteúdo vai variar do valor inicial até o valor final, de 1 em 1, incrementando automatica-
mente. Exemplo:

ALGORITMO
DECLARE J NUMÉRICO
PARA J ← 1 ATE 10 FAÇA
INÍCIO
ESCREVA J
FIM
FIM_ALGORITMO
ANOTAÇÕES

8 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Acima, o ESCREVA J será repetido 10 vezes. Neste caso, o valor de J será atualizado até
25m chegar no valor final determinado.

Exemplo de caso mais elaborado para calcular um número fatorial:

ALGORITMO "FATORIALCOMPARA"
DECLARE NUMERO, FATORIAL, CONTADOR NUMÉRICO
ESCREVA "DIGITE O NÚMERO PARA CALCULAR O FATORIAL: "
LEIA NUMERO
FATORIAL ← 1
PARA CONTADOR DE 1 ATE NUMERO FACA
INICIO
FATORIAL ← FATORIAL * CONTADOR
FIM
ESCREVA "O FATORIAL DE ", NUMERO, " É : ", FATORIAL
FIM_ALGORITMO

Acima, sabia-se previamente o número de vezes em que o passo seria repetido para
fazer o cálculo do fatorial.

Estrutura de Repetição ENQUANTO


Essa estrutura de repetição é utilizada quando não se sabe o número de vezes em que
um trecho do algoritmo deve ser repetido, embora também possa ser utilizada quando se
sabe esse número.

ENQUANTO condição FACA comando1.


Enquanto a condição for verdadeira, o comando1 será executado.

ENQUANTO condição FACA


INÍCIO
comando1
comando2
FIM
ANOTAÇÕES

9 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Enquanto a condição for verdadeira, o comando1 e o comando2 serão executados.

O “ENQUANTO” pode ser também estruturado em blocos. É importante que o comando1


e comando2 façam algo para alterar a condição, a fim de não entrar em looping infinito.

ALGORITMO
DECLARE J NUMÉRICO
J←1
ENQUANTO J <= 10 FAÇA
INICIO
ESCREVA J
J←J+1
FIM
FIM_ALGORITMO

ALGORITMO "FATORIALCOMENQUANTO"
30m
DECLARE NUMERO, FATORIAL, CONTADOR NUMÉRICO
ESCREVA "DIGITE O NÚMERO PARA CALCULAR O FATORIAL: "
LEIA NUMERO
FATORIAL ← 1
CONTADOR ← 1
ENQUANTO CONTADOR <= NUMERO FACA
INICIO
FATORIAL ← FATORIAL * CONTADOR
CONTADOR ← CONTADOR + 1
FIM
ESCREVA "O FATORIAL DE ", NUMERO, " É : ", FATORIAL
FIM_ALGORITMO

 Obs.: o encremento é muito importante para que a condição “ENQUANTO CONTADOR <=
NUMERO FACA” seja alterada, evitando um looping infinito.
ANOTAÇÕES

10 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Estrutura de Repetição REPITA


A diferença entre a estrutura ENQUANTO e a estrutura REPITA é que na estrutura REPITA
os comandos serão repetidos pelo menos uma vez, já que a condição se encontra no final.

REPITA
comando1
comando2
ATÉ condição

Enquanto a condição for falsa, o comando1 e o comando2 serão executados. No


momento em que a condição for verdadeira, o código parará.

ALGORITMO
DECLARE J NUMÉRICO
J←1
REPITA
ESCREVA J
J←J+1
ATÉ J > 10
FIM_ALGORITMO

 Obs.: quando J passar o valor de 10, o código parará.

ALGORITMO "SOMAATEVALORIGUALA0"
DECLARE VALORDIGITADO, SOMA NUMÉRICO
SOMA ← 0
REPITA
ESCREVA "DIGITE UM VALOR PARA A SOMA: "
LEIA VALORDIGITADO
SOMA ← SOMA + VALORDIGITADO
ESCREVAL "TOTAL: ", SOMA
ATE VALORDIGITADO = 0
FIM_ALGORITMO
ANOTAÇÕES

11 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Acima, o bloco será executado até que o usuário digite 0.

GABARITO
1. C

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

12 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

PROGRAMAÇÃO ESTRUTURADA III

Vetor
Um vetor é uma variável composta, homogênea e unidimensional.

É considerada composta porque possui vários valores dentro dela. Ao declarar valores de
X e Y como variáveis, em vetores é possível guardar diversos valores.

É dita homogênea porque todos os valores devem ser do mesmo tipo. Assim, em vetores
de números, somente poderá haver números – a depender da linguagem de programação
(ex.: Java – vetores homogêneos. Já no Java Script, há vetores heterogêneos).

É unidimensional porque somente há uma dimensão (um comprimento) – ex.: fila de valo-
res. Cada valor terá um índice, que é a sua posição em uma fila de variáveis.

É formada por uma sequência de variáveis, todas do mesmo tipo de dados, com o mesmo
identificador (mesmo nome) e alocadas sequencialmente na memória.

Uma vez que as variáveis que compõem o vetor têm o mesmo nome, o que distingue
cada uma delas é um índice, que referencia sua localização dentro da estrutura. Ex.: em uma
fila de pessoas, para interagir com a terceira pessoa da fila, basta contar quantas pessoas
há para se chegar à terceira.

Vetor: Declaração
DECLARE nome[tamanho] tipo
nome: nome da variável do tipo vetor.
tamanho: é a quantidade de variáveis que vão compor o vetor.
tipo: é o tipo básico de dados que poderá ser armazenado na sequência de variáveis que
formam o vetor.
ANOTAÇÕES

1 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Vetor: Exemplos
5m
DECLARE X[5] NUMÉRICO
X[1] ← 45
X[4] ← 0
ESCREVA X[4]

Em uma estrutura com vários valores do mesmo tipo, ao invés de declarar diversas vari-
áveis, basta escrever um vetor e entre colchetes o tamanho do vetor.

Carregando um Vetor
PARA I ← 1 ATÉ 5 FAÇA
INÍCIO
ESCREVA "DIGITE O ", I, " NÚMERO"
LEIA X[I]
FIM

É possível realizar uma estrutura de repetição PARA para que ela alimente o vetor com
valores digitados pelo usuário.

Matriz
Uma matriz é uma variável composta homogênea bidimensional formada por uma sequ-
ência de variáveis, todas do mesmo tipo, com o mesmo identificador (mesmo nome) e aloca-
das sequencialmente na memória.

Uma vez que as variáveis têm o mesmo nome, o que as distingue são índices que refe-
renciam sua localização dentro da estrutura. Uma variável do tipo matriz é composta por
linhas e colunas.

Matriz: Declaração
DECLARE nome[linha, coluna] tipo
nome: nome da variável do tipo matriz.
linha: é a quantidade de linhas que vão compor a matriz.
coluna: é a quantidade de colunas que vão compor a matriz.
ANOTAÇÕES

2 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

tipo: é o tipo básico de dados que poderá ser armazenado na sequência de variáveis que
formam a matriz.

Matriz: Exemplos
DECLARE X[3,5] NUMÉRICO
X[1, 2] ← 45
X[2, 5] ← 0
ESCREVA X[1, 2]

Obviamente que a utilização de vetor ou matriz dependerá do caso e da utilidade quanto


ao dado. Exemplo: em um programa que multiplica uma matriz por outra matriz, o uso da
matriz é essencial.
10m

Carregando uma Matriz


PARA I ← 1 ATÉ 3 FAÇA
INÍCIO
PARA J ← 1 ATÉ 5 FAÇA
INÍCIO
LEIA X[I, J]
FIM

Obs.: acima, nota-se um looping dentro do outro, podendo popular a matriz.

Registros
Registros são estruturas que podem agregar diferentes informações. Dessa maneira,
podem ser feitas diferentes combinações, gerando novos tipos de dados.

O registro é o primeiro movimento no sentido de criar tipos de dados que a linguagem de


programação não forneça.

Um registro é uma coleção de campos, em que cada campo pode ser de um tipo de dado
diferente. Por isso, os registros são conhecidos como variáveis compostas heterogêneas.
ANOTAÇÕES

3 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Registros: Declaração
DECLARE nome_da_variável_registro REGISTRO (nome_campo tipo_do_campo...)

Registros: Exemplo
DECLARE conta REGISTRO (num, saldo NUMÉRICO, nome LITERAL)

Acima, o registro declarado é denominado conta e possui três campos, os campos num
e saldo são campos numéricos e o campo nome é do tipo literal.

Quando o programa se torna mais elaborado, há uma necessidade de criação de tipos de


dados (muitas vezes customizados), e o registro é a forma mais básica para tanto. Exemplo:
registro de um aluno com nome, idade, data de nascimento, CPF.

É importante destacar que a implementação do registro variará de uma linguagem para


outra. Mas, de forma geral, segue-se um padrão.
15m

DECLARE conta[3] REGISTRO (num, saldo NUMÉRICO, nome LITERAL)

O registro declarado é um vetor denominado conta e possui três campos, os campos


num e saldo são campos numéricos e o campo nome é do tipo literal.

É possível combinar tipos de dados homogêneos com o tipo de dado registro para con-
seguir mais dados. Exemplo: em uma escola com vários alunos, é possível ter um vetor de
alunos, e cada aluno possui um registro com suas propriedades.

Arquivo
Um arquivo é formado por uma coleção de registros, cada registro é composto por campos
e cada campo possui suas características específicas.

Na computação, o arquivo é em geral utilizado para manter a persistência de dados.


Exemplo: feito um processamos, gerou-se um grande número de dados de respostas. É pos-
sível pegar esses dados e estruturá-los em registros, e persistir os registros no computador,
de forma que possam ser lidos depois (eventualmente) por uma outra execução de programa.
ANOTAÇÕES

4 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. (IDECAN/INMETRO/ASSISTENTE EXECUTIVO EM METROLOGIA E QUALDIDADE/
INFORMÁTICA/2015) Toda linguagem de programação possui instruções que contro-
lam o fluxo da execução de um programa. Essas estruturas podem ser de decisão,
decisão encadeada, repetição, repetição encadeada, cada uma com seus respectivos
comandos. Observe o fluxograma.

Assinale, a seguir, o comando representado nesse fluxograma.


a. SE... ENTÃO.
b. SELECIONE... CASO.
c. ENQUANTO... FAÇA.
d. REPITA... ATÉ QUE.
e. SE... ENTÃO... SENÃO.

COMENTÁRIO
A imagem da questão apresenta uma condição booleana.
O SE está representado pela condição. O ENTÃO está representado pelo fluxo de Verda-
deiro, enquanto o SENÃO está representando quando a resposta for Falsa.
20m

5 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Sub-Rotinas (Programação Modularizada)


Sub-rotinas são blocos de instruções que realizam tarefas específicas.

De fato, ao se escrever um código de programa que se alonga bastante, notam-se linhas


de códigos repetidos ou muitos trechos que podem ser utilizados em outros programas a
serem desenvolvidos. Para reaproveitar essas linhas de códigos, utilizam-se sub-rotinas.

O código de uma sub-rotina é carregado uma vez e pode ser executado quantas vezes
forem necessárias. Assim, os programas tendem a ficar menores e mais organizados, uma
vez que o problema pode ser dividido em tarefas menores.

Ex.: o programador escreve um código de calcule fatorial. Em outro programa, o progra-


mador precisará de um código que calcule o fatorial. Neste caso, o programador separará
o código em blocos, mesmo que para utilizar em seu próprio programa, para evitar cópias
que possam gerar erros. Esses blocos escritos são guardados, atribuídos a um identificador,
sendo eles acionados quantas vezes forem necessárias.

Em geral, um programa é executado linearmente, uma linha após a outra, até o fim.
Entretanto, quando são utilizadas sub-rotinas, é possível a realização de desvios na execu-
ção natural dos programas. Assim, um programa é executado linearmente até a chamada de
uma sub-rotina.

O programa que chama uma sub-rotina ("chamador") é temporariamente suspenso e


o controle é passado para a rotina, que é executada. Ao terminar a sub-rotina, o controle
retorna para o programa que realizou a chamada ("chamador").

Ou seja, são os blocos separados da rotina principal e nomeados. Na medida em que se


executa os programas principais, os blocos serão chamados, passando o controle para os
blocos até terminar a execução. Exemplo: um programa que calcula o fatorial fará a leitura do
valor passado pelo usuário, chamando eventualmente a sub-rotina que calcula o fatorial, cal-
culando e devolvendo o valor, e, em seguida, o controle volta para o seu programa principal.
25m
ANOTAÇÕES

6 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Tipos de Sub-rotinas
• Funções (functions);
• Procedimentos (procedures).

Funções
É comum encontrar, nas linguagens de programação, várias funções embutidas, por
exemplo, sin (seno), cos (cosseno), abs (valor absoluto), sqrt (raiz quadrada).

Funções embutidas podem ser utilizadas diretamente em expressões. Por exemplo, o


comando: hipotenusa ← sqrt(cateto1^2 + cateto2^2).

Na maioria das linguagens de programação, há a chamada biblioteca básica, que possui


as funções matemáticas mais comuns, além de uma série de funções que se repetem em
vários programas.

Essas funções são utilizadas em expressões como se fossem simplesmente variáveis


comuns. E como variáveis comuns, as funções têm (ou retornam) um único valor.

É responsabilidade do programador fornecer os argumentos (ou parâmetros) necessá-


rios para a função efetuar seus cálculos.

Exemplo: hipotenusa ← sqrt(cateto1^2 + cateto2^2). Antes de a função ser passada para


o sqrt (raiz quadrada), calcula-se o valor interno “(cateto1^2 + cateto2^2)”, enviando para o
sqrt o valor já calculado. Todo esse bloco terá a mesma função como se fosse uma variável,
sendo atribuída ao valor de hipotenusa.

A utilização de funções afeta o fluxo de controle em um programa.

Quando uma função é chamada, o programa que chama a função fica em estado de
espera e o controle passa para as instruções que definem a função.

Após a execução da função com os parâmetros fornecidos, o controle retorna ao ponto


de chamada da função, com o valor calculado pela função.
ANOTAÇÕES

7 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Programação Estruturada III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Exemplo de como se utiliza as funções embutidas e entregues pela linguagem de


programação:
ALGORITMO
DECLARE X, Y, VALOR NUMÉRICO
X – ← -10
Y ← 16
VALOR ← ABS(X) + SQRT(Y)
ESCREVA VALOR
FIM

GABARITO
1. e

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

8 www.grancursosonline.com.br
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

HEAPS

Esta estrutura de dados não é, talvez, das mais faladas, como as árvores, vetor, listas,
pilhas, filas: é a HEAPS, um nome em inglês, que não é traduzido.
Quem já trabalhou com Java já ouviu falar de HEAPS porque tem alguma relação com o
gerenciamento de memória do Java.

ALGORITMOS E ESTRUTURA DE DADOS


• Referências

www.grancursosonline.com.br 1
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Introdução

Um heap é uma estrutura de dados baseada em árvore na qual todos os nós da árvore
estão em uma ordem específica. Quando a referência é estrutura de dados, de imediato há
a associação com filas, pilhas, vetor, árvores, até mesmo grafo: é uma forma de organizar
dados na memória do computador. Existem vários tipos de árvores, as ordenadas, as não
ordenadas, árvores bem interessantes, como a árvore AVL, que facilita a busca, a coorde-
nação dos elementos, a inserção de busca de elementos. Para cada tipo de operação, para
cada foco existente no sistema, haverá uma estrutura de dados que será a mais adequada
para atender esse sistema.
No caso do heap é uma estrutura de dados que será bastante adequada para que se
possa ter algo como uma prioridade, ter tarefas em prioridade: inserem-se novos elementos,
novos Jobs, novas tarefas, determinando prioridades de forma a acessá-las de forma mais
rápida possível. O que se pretende é uma alta performance de inserção de tarefas e acessar
a prioritária da forma mais rápida possível. Este é o exemplo clássico de utilização de heaps.
Por exemplo, se X é o nó pai de Y, então o valor de X segue uma ordem específica com rela-
ção ao valor de Y, e a mesma ordem será seguida pela árvore;
5m
O número máximo de filhos de um nó em um heap depende do tipo de heap. No entanto,
no tipo mais usado, existem no máximo 2 filhos de um nó e é conhecido como heap binário;
No heap binário, se for uma árvore binária completa com N nós, então ele tem a menor altura
possível, que é log 2 N. É uma estrutura que vai tentar se manter triangular e dinamicamente,
vai reposicionar os elementos para evitar a existência de árvores deterioradas, aquelas árvo-
res que puxam galhos para um determinado lado, o que deteriora muito a ordenação dos ele-
mentos por busca. É uma árvore que vai se “rebalancear” para ficar na menor forma possível,
o mais triangular possível.

No diagrama, você pode observar uma sequência específica, ou seja, cada nó tem um
valor maior que qualquer um de seus filhos. Suponha que haja N Trabalhos em uma fila a
serem executados e cada trabalho tenha sua própria prioridade.
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O trabalho com prioridade máxima será concluído primeiro que os outros. A cada ins-
tante, estamos concluindo um trabalho com prioridade máxima e, ao mesmo tempo, também
estamos interessados em inserir um novo trabalho na fila com sua própria prioridade.
Numa árvore AVL, de busca, o elemento do meio será, mais ou menos, o elemento mediano,
sendo que à direita estão os elementos maiores e à esquerda os elementos menores.
No caso do heap a tendência é de que os elementos maiores estejam mais em direção ao
topo e na raiz da heap, no caso de uma heap máxima, estará o maior elemento de todos.Por-
tanto, a cada instante, precisamos verificar o trabalho com prioridade máxima para concluí-lo
e também inserir se há um novo trabalho. Essa tarefa pode ser muito facilmente executada
usando um heap, considerando N trabalhos como N nós da árvore.
É necessário saber qual é o caso de uso principal do heap: não é para ordenação, não
é para busca, é para, por exemplo, prioridades de trabalhos, encontrar o trabalho com maior
prioridade. Ele terá operações que são mais simples do que a de uma árvore AVL que faz
uma série de rotações à direita e à esquerda, ele precisará de menos rotações o que vai
consumir menos recursos do sistema e, por outro lado, ele também tem uma finalidade espe-
cífica para localizar somente o menor ou o maior elemento dentro do heap, o elemento com
maior ou menor prioridade.
Um vetor pode ser usado para simular uma árvore da seguinte maneira: Se estamos
armazenando um elemento no índice i do vetor vet, seu pai será armazenado no índice i/2 (a
menos que seja uma raiz, pois a raiz não tem pai) e pode ser acessado por vet[i/2], e seu filho
esquerdo pode ser acessado por vet[2*i] e seu filho direito pode ser acessado por vet[2*i+1].
O índice de raiz será 1 em um vetor.
Por vezes, para trabalhar com uma árvore, não é necessário trabalhar com ponteiros,
pode-se trabalhar com um vetor tradicional. Um elemento na posição 1, o filho esquerdo
estará à direita e o filho direito em 2 x 1 + 1 = 3. Esses elementos significam que se teria o
seguinte heap.
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Podemos usar um vetor para armazenar os nós da árvore. Digamos que temos elemen-
tos com valores {6, 4, 5, 3, 2, 0, 1}.

Dentre os HEAPS há duas categorias principais: o heap máximo e o heap mínimo.

Heap Máximo

Nesse tipo de heap, o valor do nó pai sempre será maior ou igual ao valor do nó filho na
árvore e o nó com o valor mais alto será o nó raiz da árvore.
10m
Implementação: vamos supor que temos um heap com alguns elementos que são arma-
zenados no vetor. A maneira de converter esse vetor em uma estrutura de heap é a seguinte:
Escolhemos um nó no vetor, verificamos se a subárvore esquerda e a subárvore direita são
heaps máximos, em si mesmos e o próprio nó é um heap máximo (seu valor deve ser maior
que todos os nós filhos). Para fazer isso, implementa-se uma função que pode manter a pro-
priedade max heap.
ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

void max_heapify(int Arr[], int i, int N) {


int left = 2 * i// filho da esquerda
int right = 2 * i +1// filho da direita
if (left <=N and Arr[left] > Arr[i])
largest = left;
else
largest = i;
if (right <= N and Arr[right] > Arr[largest])
largest = right;
if (largest!= i) {
swap(Arr[i], Arr[largest]);
max_heapify(Arr, largest, N);
}
}

Como 8 é maior que 4, então 8 é trocado por 4 e max_heapify é executado novamente


em 4, mas em posição diferente. Agora, na etapa 2, 6 é maior que 4, então 4 é trocado por 6 e
obteremos um heap máximo, como agora 4 é um nó folha, portanto, uma chamada adicional
para max_heapify não criará nenhum efeito no heap. Agora, como podemos ver, podemos
manter o maxheap usando a função max_heapify.
15m

Construindo um Heap Máximo


Agora vamos dizer que temos N elementos armazenados no vetor Vet indexado de 1 para
N. No momento, eles não estão seguindo a propriedade max heap. Portanto, podemos usar
a função max_heapify para fazer um heap máximo fora do vetor.
ANOTAÇÕES

www.grancursosonline.com.br 5
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

void build_maxheap(int Arr[]) {


for (int i = N / 2; i >= 1; i--)
{ max_heapify(Arr, i, N);
}
}
Pode-se pegar qualquer vetor numérico, considera-se que ele é um heap, atravessa-se
esse vetor utilizando-se a função max_heapify, que transformará esse vetor que não é um
heap num heap, mantendo-se aquelas propriedades de Nó ali ordenado.

Heap Mínimo

Nesse tipo de heap, o valor do nó pai sempre será menor ou igual ao valor do nó filho na
árvore e o nó com menor valor será o nó raiz da árvore:

Cada nó tem um valor menor que o valor de seus filhos. Podemos executar as mesmas
operações que as realizadas na construção de max_heap. Primeiro criaremos uma função
que pode manter a propriedade min heap, se algum elemento a estiver violando.

void min_heapify(int Arr[], int i, int N) { int left = 2 * i;


int right = 2 * i + 1;
int smallest;
ANOTAÇÕES

www.grancursosonline.com.br 6
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

if (left <= N and Arr[left] < Arr[i])


smallest = left;
else
smallest = i;
if (right <= N and Arr[right] < Arr[smallest])
smallest = right;
if (smallest!= i) {
swap(Arr[i], Arr[smallest]);
min_heapify(Arr, smallest, N);
}
}

Agora vamos usar a função na construção de min-heap. Executaremos a função nos nós
restantes que não sejam folhas, pois os nós folha são um heap de um elemento:

void build_minheap (int Arr[ ]) {


for( int i = N/2; i >= 1; i--) {
min_heapify (Arr, i);
}
}
ANOTAÇÕES

www.grancursosonline.com.br 7
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. (2018/CCV-UFC/ANALISTA DE TECNOLOGIA DA INFORMAÇÃO) Na estrutura de da-
dos min heap (heap mínima), qual das afirmativas abaixo é verdadeira?

a. O maior valor é guardado no nó raiz.


b. Os nós filhos possuem valores menores do que os nós pais.
c. Os nós pais possuem valores menores do que os nós filhos.
d. É uma estrutura de dados organizada como uma árvore de qualquer ordem.
e. Uma min heap pode ser organizada por meio de uma árvore binária desbalanceada.

20m
ANOTAÇÕES

www.grancursosonline.com.br 8
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMENTÁRIO
Heap mínimo

a. O MENOR valor é guardado no nó raiz.


b. Os nós filhos possuem valores MAIORES do que os nós pais.
c. Os nós pais possuem valores menores do que os nós filhos.
d. É uma estrutura de dados organizada obedecendo a uma ordem.
e. Uma min heap pode ser organizada por meio de uma árvore binária balanceada.
Nesse tipo de heap, o valor do nó pai sempre será menor ou igual ao valor do nó filho na
árvore e o nó com menor valor será o nó raiz da árvore.

2. (2010/CESPE/INMETRO/PESQUISADOR/DESENVOLVIMENTO DE SISTEMAS) Na
primeira fase do método de ordenação usando uma árvore binária (heapsort), deve ser
montada uma heap a partir do vetor com os dados que se deseja ordenar, conforme os
mostrados na tabela a seguir.

www.grancursosonline.com.br 9
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Considerando essas informações, assinale a opção que apresenta a heap max (toda a
árvore ordenada como uma heap) formada ao final dessa fase, antes da classificação pro-
priamente dita.

a.

b.

c.

d.
ANOTAÇÕES

www.grancursosonline.com.br 10
DESENVOLVIMENTO WEB
Heaps

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

e.

COMENTÁRIO
Criar uma heap max a partir do vetor abaixo.

a. O 30 é maior do que 20.


b. É um heap max.
c. É um heap max. O valor 15 não está presente no vetor acima.
d. O 15 é maior do que 10 e está abaixo.
e. Está na parte debaixo o 50.

GABARITO
1. c
2. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 11
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

PILHAS

Pilhas é um tópico de algoritmos e estrutura de dados.

REFERÊNCIAS

As referências para pilhas e estruturas de dados é “Estruturas de dados usando C” de


Tenenbaum e o resumo disponível no site tutorialspoint.
O livro de Tenenbaum é um conteúdo profundo demais para o assunto de pilhas, que
pode ser estudado de forma completa com conteúdos resumidos, o que otimiza o tempo.

PILHA

O conteúdo de pilha está muito associado ao de fila. É possível fazer analogias diretas ao
mundo real, o que torna mais fácil o entendimento. A fila é quem chega primeiro, sai primeiro,
já quem chega por último vai para o fim da fila e demorará mais para ser atendido. No caso
da pilha, faz-se a analogia clássica com a pilha de pratos que será lavada na pia: os pratos
são colocados um em cima do outro e o último prato colocado é o primeiro a ser lavado.
ANOTAÇÕES

www.grancursosonline.com.br 1
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Uma pilha é uma estrutura de dados dinâmica, assim como a fila, que admite remoção de
elementos e inserção de novos objetos.
Mais especificamente, uma pilha (stack) é uma estrutura sujeita à seguinte regra de ope-
ração: sempre que houver uma remoção, o elemento removido é o que está na estrutura há
menos tempo. Adiciona-se de baixo para cima, mas a remoção é feita de cima para baixo, ao
contrário da fila, em que será removido da dianteira em relação à traseira.
Em outras palavras, o primeiro objeto a ser inserido na pilha é o último a ser removido.
Exemplo: pilha de pratos para lavar, em que o primeiro prato colocado é o último e ser lavado.
5m
Essa política é conhecida pela sigla LIFO (Last-In-First-Out), ou seja, o último que chega
é o primeiro a sair.
Uma pilha é um Abstract Data Type (ADT), comumente usado na maioria das linguagens
de programação. Exemplo: programação de pilha de trabalho ou de mensagens.
É denominada pilha, pois se comporta como uma pilha do mundo real — por exemplo: um
baralho de cartas ou pilha de pratos, etc.
A pilha é um tipo de dado abstrato porque não trabalha com um tipo específico. Ela não
é usada para trabalhar apenas com números, letras ou com um tipo específico de objeto.
Pode-se ter uma pilha implementa para qualquer tipo diferente de objeto.
Uma pilha do mundo real permite operações apenas em uma extremidade. Por exemplo,
pode-se colocar ou remover uma carta ou prato apenas da parte superior da pilha. Ao contrá-
rio disso, pode-se operar nas duas extremidades da fila.
Da mesma forma, a pilha permite todas as operações de dados em apenas uma extre-
midade. A qualquer momento, pode-se acessar apenas o elemento superior de uma pilha.
Esse recurso torna a estrutura de dados LIFO. LIFO significa Last-in-first-out. Aqui, o ele-
mento que é colocado (inserido ou adicionado) por último é acessado primeiro. Na terminolo-
gia da pilha, a operação de inserção é chamada operação PUSH e a operação de remoção
é chamada operação POP.

ATENÇÃO
É importante saber a nomenclatura em inglês.
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Coloca-se (push) e retira-se (pop) os dados apenas em uma extremidade. Por essa razão,
a pilha é considerada um pouco mais simples que a fila por conta de sua operação.

REPRESENTAÇÃO DE PILHA

Uma pilha pode ser implementada por meio de um vetor, estrutura, ponteiro e lista ligada.
O caso mais simples é a implementação de um vetor, que é uma estrutura de dados de tama-
nho fixo e que tem alocação inicial de memória.
10m
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A pilha pode ser de tamanho fixo ou pode ter um redimensionamento dinâmico. Caso seja
implementada um vetor, a pilha terá um tamanho fixo. Ou seja, pode-se ter o número máximo
de elementos determinado se estiver trabalhando com vetor ou depender da memória e ter
um redimensionamento dinâmico, principalmente se estiver trabalhando com estruturas de
dados, como, por exemplo, a lista ligada, e aumentar o número de elementos.

OPERAÇÕES BÁSICAS

As operações da pilha podem envolver inicializar a pilha, usá-la e, em seguida, descartá-


-la. As operações básicas da pilha são:
• push() — Empurra (armazena) um elemento na pilha;
• pop() — Remove (acessa) um elemento da pilha.
No entanto, na implementação de computação de uma pilha, são necessárias mais ope-
rações. Para usar uma pilha com eficiência, precisamos também poder verificar o status da
pilha. Para isso são implementadas as seguidas funcionalidades:
• peek() — obtém o elemento de dados do topo da pilha, sem removê-lo;
O peek também existe para a fila.
• isFull() — verifica se a pilha está cheia;
Quando se trabalha com vetor, principalmente, a pilha terá um tamanho fixo. Ao fazer um
push (empilhar), é importante o algoritmo verificar se a pilha está cheia, pois, se estiver, não
será possível empilhar mais elementos.
• isEmpty() — verifica se a pilha está vazia.
Antes de fazer a operação de pop, deve-se verificar se a pilha não está vazia e remover
o elemento. Se a pilha estiver vazia, não retorna o pop, mas sim algum tipo de erro ou indi-
cativo de que a pilha está vazia.
Sempre é mantido um ponteiro para o último elemento colocado na pilha. No caso da fila,
tem-se um ponteiro apontando para o final da fila e outro apontando para o início. Já na pilha
o ponteiro indica apenas o topo, pois se trabalha com operação em um lado da estrutura de
dados. Como esse ponteiro sempre representa o topo da pilha é, portanto, denominado top.
O ponteiro superior fornece o valor máximo da pilha sem removê-lo.
ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

peek

A operação de peek retorna o elemento que está no topo da pilha (stack) sem removê-lo.

isfull

A operação de isfull pergunta para a pilha se ela está cheia. Se a pilha já está cheia (top
= maxsize), o retorno é true; se não, o retorno é false.

isempty

A implementação da função isempty() na linguagem de programação C é um pouco dife-


rente. Inicia-se o topo em -1, pois o índice no vetor começa em 0. Portanto, verifica-se se o
topo está abaixo de zero ou -1 para determinar se a pilha está vazia.
15m
Na maioria das linguagens de programação, o índice inicial do vetor começa no zero, e
não no 1. Nesse caso, verificar-se-á se o top é igual a -1, ou seja, se a pilha está vazia.

www.grancursosonline.com.br 5
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

push

O processo de colocar um novo elemento de dados na pilha é conhecido como Operação


Push. A Operação de Push envolve uma série de etapas:
• Etapa 1 — Verificar se a pilha está cheia;
• Etapa 2 — Se a pilha estiver cheia, produz um erro e sai;
• Etapa 3 — Se a pilha não estiver cheia, incrementa para cima para apontar para o pró-
ximo espaço vazio;
• Etapa 4 — Adiciona o elemento de dados ao local da pilha, onde a parte superior está
apontando;
• Etapa 5 — Retorna sucesso.
Na operação de push, principalmente se estiver trabalhando com vetor de tamanho fixo,
é preciso verificar se a pilha está cheia.
ANOTAÇÕES

www.grancursosonline.com.br 6
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

De acordo com a imagem, o elemento E move o top para cima.

Push recebe um número inteiro de dado. Se não estiver full, incrementa o valor do top
em 1 unidade.
stack[top] = data; — a pilha, que é um vetor na posição top, aponta para o dado; se não,
imprime “Não foi possível inserir, pilha está cheia”.
Lembrando que pop é a operação que coloca o elemento na pilha.

pop

O acesso ao conteúdo ao removê-lo da pilha é conhecido como Operação Pop.


Em uma implementação de vetor, o elemento de dados não é realmente removido, em
vez disso, top é decrementado para uma posição mais baixa na pilha para apontar para o
próximo valor.
Não é preciso apagar, de fato, o dado. Move-se o top uma unidade para baixo e o ele-
mento será sobrescrito na próxima operação de inserção. Esse pequeno ajusto, de certa
forma, adiciona um pouco de performance no sistema, porque seria uma operação pratica-
mente inútil, pois, posteriormente haverá um sobrescrito.
Mas, na implementação de lista ligada, pop(), na verdade, remove o elemento de dados
e desaloca o espaço de memória.
Uma operação Pop pode envolver as seguintes etapas:
• Etapa 1 — Verifica se a pilha está vazia;
• Etapa 2 — Se a pilha estiver vazia, produz um erro e sai;
ANOTAÇÕES

www.grancursosonline.com.br 7
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

• Etapa 3 — Se a pilha não estiver vazia, acessa o elemento de dados no qual a parte
superior está apontando;
• Etapa 4 — Diminui o valor de top em 1;
• Etapa 5 — Retorna sucesso.

Se não estiver vazio, pega-se data e faz stack[top], top retorna -1 e faz retorno de data;
se não, imprime “Não foi possível recuperar o dado, a pilha está vazia”.
20m

DIRETO DO CONCURSO
1. (2009/UNRIO/TÉCNICO DE TECNOLOGIA DA INFORMAÇÃO) Sobre listas encadea-
das, é INCORRETO afirmar que:
A estrutura de dados pilha segue uma política de inserção e remoção do tipo
a. LIFO — Last In, First Out (o último a entrar é o primeiro a sair).
b. FIFO — First In, First Out (o primeiro a entrar é o primeiro a sair).
c. Depth-First (priozirando a profundidade).
d. Beadth-First (priorizando a largura).
e. Beast-First (priorizando o melhor de acordo com uma dada regra).

COMENTÁRIO
A política da pilha é de LIFO (Last-In-First-Out)
ANOTAÇÕES

www.grancursosonline.com.br 8
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

2. (2010/CESGRANRIO/PETROBRAS/ANALISTA DE SISTEMAS JÚNIOR — ENGENHA-


RIA DE SOFTWARE) Uma sequência desordenada de números armazenada em um
vetor é inserida em uma árvore AVL. Após a inserção nesta árvore, é feito um percurso
em ordem simétrica (em ordem) e o valor de cada nó visitado é inserido em uma pilha.
Depois de todos os nós serem visitados, todos os números são retirados da pilha e
apresentados na tela.

A lista de números apresentada na tela está


a. Ordenada ascendentemente de acordo com os números.
b. Ordenada descendentemente de acordo com os números.
c. Na mesma ordem do vetor original.
d. Na ordem inversa do vetor original.
e. Ordenada ascendentemente de acordo com sua altura na árvore.

COMENTÁRIO
Por simplicidade, trabalhar-se-á com vetor de 3 elementos: 2, 1 e 3.
A árvore AVL se auto balanceará em cada inserção, tornando-se uma árvore biná-
ria de busca.
Primeiro, insere-se 2 na raiz da árvore e, depois, 1. Como 1 é menor que 2, ocorre uma
troca. O 3 entra para a direita.
ANOTAÇÕES

www.grancursosonline.com.br 9
DESENVOLVIMENTO WEB
Pilhas

Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Assim, tem-se uma árvore binária de busca balanceada, aonde à esquerda se tem os nós
de valores menores (1) e à direita se tem os nós de números maiores (3). Independente da
ordem dos valores no vetor, a árvore AVL ficaria com essa disposição.
O percurso em ordem é nó esquerdo, raiz e nó direito. Feito isso, são colocados na pilha
1, 2 e 3 na seguinte ordem: 3, 2 e 1.

São retirados os elementos do topo na seguinte ordem: 3, 2 e 1. Ou seja, a lista de núme-


ros apresentada na tela está eles ordenada descendentemente de acordo com os números.
25m

GABARITO
1. a
2. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.

www.grancursosonline.com.br 10
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

FILAS

As estruturas de dados é a base para o aprendizado de banco de dados e outras estrutu-


ras mais elaboradas. As filas é um tópico de algoritmos e estruturas de dados.

REFERÊNCIA

São referências dessa matéria o livro de Tenenbaum e alguns resumos encontrados no


tutorials point. O material de Tenenbaum é considerado profundo demais, mas os materiais
mais curtos acabam atendendo o aprendizado muito bem.

FILA
A regra de uma fila de banco é que quem entra primeiro irá sair primeiro e quem entra
depois irá sair ao fim da fila. Os elementos do meio não são removidos. Trabalha-se com a
ponta e o final da fila. O elemento novo irá para o fim da fila e o próximo elemento a ser aten-
dido é o da ponta da fila. Uma fila é uma estrutura de dados dinâmica que admite remoção
de elementos e inserção de novos objetos.
Mais especificamente, uma fila (queue) é uma estrutura sujeita à seguinte regra de operação:
sempre que houver uma remoção, o elemento removido é o que está na estrutura há mais tempo.
Em outras palavras, o primeiro objeto inserido na fila é também o primeiro a ser removido. Essa
política é conhecida pela sigla FIFO (First-In-First-Out) — primeiro que entra, primeiro que sai.
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A fila é uma estrutura de dados abstrata, um pouco semelhante a pilhas. A fila é abstrata,
porque, em geral, ela admite vários tipos de dados diferentes, não sendo usada apenas para
números ou textos. O conceito irá funcionar para qualquer tipo de dado.

ATENÇÃO
É importante saber diferenciar fila de pilha, principalmente sobre a questão de ordem de
inserção e remoção de elementos.

Diferente das pilhas, uma fila é aberta nas duas extremidades. Uma extremidade é sempre
usada para inserir dados (enfileirar) e a outra é usada para remover dados (enfileirar).
5m
A fila segue a metodologia First-In-First-Out, ou seja, o item de dados armazenado pri-
meiro será acessado primeiro.

A fila possui apenas um sentido. Quem entrou primeiro, sai primeiro; quem entrou por
último, sai por último.

REPRESENTAÇÃO DA FILA
Em uma fila realizamos acessos nas duas extremidades por diferentes razões.
O diagrama a seguir fornecido abaixo tenta explicar a representação da fila como estru-
tura de dados:
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A estrutura é fechada, como se fosse um cano, onde só se opera pelas extremidades.


Como nas pilhas, uma fila também pode ser implementada usando vetores, listas ligadas,
ponteiros e estruturas. O vetor possui um tamanho fixo após a instanciação, mas a fila também
poderia ser programada usando uma lista ligada, que possui um cumprimento mais dinâmico.

OPERAÇÕES BÁSICAS
As operações da fila podem envolver inicializar ou definir a fila, utilizá-la e depois apa-
ga-la completamente da memória. Aqui tentaremos entender as operações básicas associa-
das às filas:

• enqueue() — adicionar (armazenar) um item à fila;


• dequeue () — remover (acessa) um item da fila.

São necessárias mais funções para tornar a operação da fila acima mencionada efi-
ciente. Estas são:

• peek() — pega o elemento na frente da fila sem removê-lo;

Existe em várias implementações uma funcionalidade que busca o elemento sem removê-
-lo. O dequeue irá retornar o elemento e, ao mesmo tempo, removê-lo da fila. Já o peek irá
simplesmente retornar o elemento próximo sem removê-lo.

• isfull () — verifica se a fila está cheia;


• isempty() — verifica se a fila está vazia.

Na fila se desenfileira (ou acessa) dados, apontados pelo ponteiro frontal e, ao enfileirar
(ou armazenar) dados na fila, ajudando o ponteiro traseiro.
peek
int peek () {
return queue[front];
}
Chama-se a operação com o front.
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Considerando que existe o queue, ele estará instanciado, com tamanho estável, se terá duas
variáveis, uma que aponta para o início e outra que aponta para o final. É como se houvesse
um vetor vazio e ao colocar elementos dentro dele há ponteiros que irão identificar os valores.
Os ponteiros são front e rear. Quando um os dois apontam para o mesmo lugar, há um
10m
elemento só.
isfull
Como se está usando um vetor de dimensão única para implementar a fila, basta verificar
se o ponteiro traseiro alcança MAXSIZE para determinar se a fila está cheia.
Caso se mantenha a fila em uma lista vinculada circular, o algoritmo será diferente.
Por simplicidade, trabalha-se com uma lista e com um vetor.
bool isfull() {
if(rear == MAXZISE – 1)
return true;
else
return false;
}
Se o ponteiro rear está em maxsize -1, então a fila estará cheia (return true). Se estiver
vazia, dará return false.

OPERAÇÃO DE ENFILEIRAMENTO
As filas mantêm dois ponteiros de dados, frontal e traseiro. Portanto, suas operações são
comparativamente mais difíceis de implementar do que as de pilhas:

• Etapa 1 — Verifique se a fila está cheia;


• Etapa 2 — Se a fila estiver cheia, produz erro de estouro e sai;
• Etapa 3 — Se a fila não estiver cheia, aumente o ponteiro traseiro para apontar para o
próximo espaço vazio;

O ponteiro traseiro aponta para o espaço que está vazio para que possa enfileirar
outro elemento.

• Etapa 4 — Adicione o elemento de dados ao local da fila, para onde a parte traseira
está apontado;
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

• Etapa 5 — Retorne o sucesso.

No caso da imagem, rear está voltando. Rear apontava para C, e como havia espaço,
adiciona-se D e aponta rear para ele. Se fosse tentado fazer um novo enfileiramento, a fila já
estaria cheia e a operação iria falhar.
enqueue
int enqueue(int data){
if(isfull())
return 0;
rear = rear + 1;
queue[rear] = data;
return 1;
}
Se a fila estiver cheia, retorna a zero. Se a fila não estiver cheia, altera-se o ponteiro do
rear para o dado.
Return 1 aponta que o elemento foi inserido com sucesso.
ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

OPERAÇÃO DE DESENFILEIRAMENTO
O acesso a dados da fila é um processo de duas tarefas — acesse os dados para onde a
frente está apontando e remova os dados após o acesso. As etapas são tomadas para exe-
cutar a operação de desenfileiramento:

• Etapa 1 — Verifique se a fila está vazia;


• Etapa 2 — Se a fila estiver vazia, produz um erro de fluxo insuficiente e sai;
• Etapa 3 — Se a fila não estiver vazia, acessa os dados para onde a frente está
apontando;
• Etapa 4 — Incremente o ponteiro frontal para apontar para o próximo elemento de
dados disponível;
• Etapa 5 — Retorne com sucesso.

Não é necessário apagar o elemento, ele simplesmente será movido.

O rear continuará apontando para o mesmo lugar. O front aponta para A, mas ao fazer dequeue,
front apontará para B. O dado que está na posição de A é ignorado e o valor de A é retomado.
15m
A operação de dequeue não só retoma o valor, mas também move o ponteiro frontal.
dequeue
int dequeue() {
if(isempty())
return 0;
int data = queue[front];
front = front + 1
return data;
}

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Filas
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Verifica se a fila está vazia. Se estiver vazia, retorna a zero; se não estiver, pega o dado
apontado pelo front, incrementa front em 1 e retorna o dado que foi buscado de queue[front].

DIRETO DO CONCURSO
1. (2014/FAFIPA/UFFS/TÉCNICO DE TECNOLOGIA DA INFORMAÇÃO) Acerca dos mo-
delos clássicos de Estruturas de Dados, aquela que define que os primeiros elementos
a serem inseridos são os primeiros elementos a serem removidos (first in, first out) é
classificada como:

a. Vetor.
b. Árvore AVL.
c. Árvore binária.
d. Pilha.
e. Fila.

COMENTÁRIO
A fila é classificada como first in, first out. A pilha é classificada como last in, first out.

2. (2013/CESPE/SEGESP-AL/PERITO CRIMINAL-TECNOLOGIA DA INFORMAÇÃO)


Julgue o item a seguir, com relação a estruturas de dados.
As duas operações básicas de uma fila são o empilhamento e o desempilhamento, tam-
bém denominadas, respectivamente, PUSH e POP.

COMENTÁRIO
Empilhamento e desempilhamento também são denominados, respectivamente, como en-
queue e dequeue. PUSH e POP são operações da pilha.

GABARITO
1. e
2. E

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
ANOTAÇÕES

preparada e ministrada pelo professor Tiago Lage Payne de Pádua.


A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Árvores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ÁRVORES I

Em termos de referências, a mais tradicional é o livro Estruturas de Dados Usando C, de


Tenenbaum.

Introdução

Árvore é representada por nós conectados por arestas. O nó é o ponto, enquanto a aresta
são ponteiros que representam outros nós.
Árvore binária é uma estrutura de dados especial usada para fins de armazenamento de
dados. O nó pode ter um filho, dois filhos ou nenhum filho.
Uma árvore binária possui uma condição especial de que cada nó pode ter no máximo
dois filhos (grau 2).
Uma árvore binária possui os benefícios de um vetor ordenado e de uma lista ligada, pois
a pesquisa é tão rápida quanto em um vetor ordenado e as operações de inserção ou exclu-
são são tão rápidas quanto na lista ligada.
5m
Na árvore binária, na medida em que os dados são inseridos, eles continuam ordenados.
Há também a possibilidade da lista ligada, que é mais simples, podendo incrementar ou eli-
minar elementos na lista sem afetar a memória. Todavia, em oposição ao que ocorre em lista
tradicional, não é possível acessar o elemento direito no index.
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Árvores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A estrutura de dados Árvore é uma estrutura que usa ponteiros para representar os nós
filhos, ou seja, trata-se de uma estrutura dinâmica.
A estruturas de dados Árvore não é linear, ou seja, os elementos que as compõem não
estão armazenados de forma sequencial e também não estão todos encadeados como em
uma lista. Note ainda que em uma árvore não existe o conceito de index. Logo, para ter
acesso a um elemento é preciso passar por todos os anteriores.
Em uma estrutura de dados Árvore cada elemento armazena um tipo de dado e ponteiros
para o elemento à esquerda e à direita, o que permite a inserção dos valores na árvore de
forma recursiva.
Características recursivas são interessantes, pois simplifica as operações, mas com um
custo de memória muito alto.
Árvore binária: os elementos menores estão à esquerda e os maiores à direita.

Intuitivamente, a operação na busca binária será mais rápida. E a busca binária em lista
ligada não é possível, pois é preciso percorrer todos os elementos para se chegar ao meio.
10m

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Árvores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Raiz é o no inicial, no topo, não possuindo nó pai.


Pai é assim chamado por tem nós filhos.
Irmão são os filhos do mesmo pai na árvore: exemplo 54 e 76 são irmão se filhos de 72.
Folha é elemento que não possui filhos.
Subárvore é o conjunto de nós, pertencentes do 17, por exemplo.
O nível corresponde os níveis onde os nós se encontram.
O grau identifica a quantidade de filhos que um nó possui.

Termos importantes
15m

• Caminho – Caminho refere-se à sequência de nós ao longo das bordas de uma árvore;
• Raiz – O nó na parte superior da árvore é chamado raiz. Existe apenas uma raiz por
árvore e um caminho do nó raiz para qualquer nó;
• Pai – Qualquer nó, exceto o nó raiz, tem uma borda para cima em relação a um nó
chamado pai;
• Filho – O nó abaixo de um determinado nó conectado por sua borda descendente é
chamado de nó filho;
• Folha – O nó que não possui nenhum nó filho é chamado de nó folha;
• Subárvore – Representa os descendentes de um nó;
• Visitar – Refere-se à verificação do valor de um nó quando o controle está no nó;
• Atravessar – Significa passar pelos nós em uma ordem específica;
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Árvores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

• Níveis – O nível de um nó representa a geração de um nó. O nó raiz está no nível 0, o


próximo nó filho está no nível 1, o neto está no nível 2 e assim por diante;
• Grau – O número de sub-árvores de um nó é o grau do nó. O grau da árvore é o
maior valor de grau de nó entre todos os nós da árvore;
• Chave – Representa um valor de um nó com base no qual uma operação de pesquisa
deve ser realizada;

Representação da Árvore de Pesquisa Binária

• A árvore Pesquisa Binária exibe um comportamento especial.


• O filho esquerdo de um nó deve ter um valor menor que o valor do pai e o filho direito
do nó deve ter um valor maior que o valor pai.
20m

Quando o número é menor, ele estará à esquerda. E quando o número é maior, ele estará
à direita.

Implementação do Nó em C

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Árvores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ÁRVORES II

Vamos dar continuidade ao assunto de “Árvores” (estrutura de dados e algoritmos). Na


primeira aula, falamos sobre conceitos básicos (nó, grau e níveis da árvore). Agora, vamos
começar a falar sobre algumas operações possíveis de serem realizadas na árvore.

Operações Básicas

As operações básicas que podem ser executadas em uma estrutura de dados da árvore
de pesquisa binária são as seguintes:

• Inserir — Insere um elemento em uma árvore/cria uma árvore;


• Pesquisar — pesquisa um elemento em uma árvore;
• Remover — Remove um elemento em uma árvore;

Essa operação é um pouco mais complicada. Ao remover um nó, não é como numa lista
ligada, em que, simplesmente, será passado o apontamento do elemento posterior para o ele-
mento anterior. Nesse caso, quando o nó tiver dois filhos, não é possível juntá-los em um só.

• Travessia em pré-ordem — Atravessa uma árvore de maneira pré-ordem;


• Travessia ordenada — Atravessa uma árvore de maneira ordenada;
• Travessia em pós-ordem — Atravessa uma árvore de maneira pós-ordem;

Inserção

A primeira inserção cria a árvore. Depois, sempre que um elemento for inserido, localize
primeiro seu local apropriado. Comece a procurar no nó raiz e, se os dados forem menores
que o valor da chave, procure o local vazio na subárvore esquerda e insira o dado. Caso con-
trário, procure o local vazio na subárvore direita e insira o dado.
Estas duas propriedades devem se manter, para que os outros algoritmos continuem fun-
cionando: ter, no máximo, dois filhos por nós e valores menores estão à esquerda e valores
maiores estão à direita.
5m
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Árvores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Vejamos a implementação do algoritmo de inserção:


insere (arvore r, no *novo) {
if (r == NULL) return novo;
if (r->chave > novo->chave)
r->esq = insere (r->esq, novo);
else
r->dir = insere (r->dir, novo);
return r;
}
No que a inserção é uma chamada recursiva. Não importa quantos elementos há, ele fará
recursivamente até encontrar.

Busca

Sempre que um elemento precisar ser pesquisado, comece a procurar no nó raiz e, se


os dados forem menores que o valor da chave, procure o elemento na subárvore esquerda.
Caso contrário, procure o elemento na subárvore direita. Além disso, siga o mesmo algoritmo
para cada nó.
Note que também haverá uma recursividade. Vejamos como é a implementação:
busca (arvore r, int k) {
if (r == NULL || r->chave == k)
return r;
if (r->chave > k)
return busca (r->esq, k);
else
return busca (r->dir, k);
}
10m

Remoção

Comecemos tratando do caso em que o nó a ser removido é a raiz da árvore. Se a raiz


não tem um dos filhos, basta que o outro filho assuma o papel de raiz. Senão, faça com que
o nó anterior à raiz na ordem e-r-d assuma o papel de raiz.
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Árvores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Será mais fácil entender esse algoritmo em sua forma visual:

15m

// Recebe uma árvore não vazia r.


// Remove a raiz da árvore e rearranja a árvore de modo que ela continue sendo
// de busca. Devolve o endereço da nova raiz.

removeraiz (arvore r) {
no *p, *q;
if (r->esq == NULL) {
q = r->dir;
free (r);
return q;
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Árvores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

}
p = r; q = r->esq;
while (q->dir!= NULL) {
p = q; q = q->dir;
}

// q é nó anterior a r na ordem e-r-d


// p é pai de q
if (p!= r) {
p->dir = q->esq;
q->esq = r->esq;
}
q->dir = r->dir;
free (r);
return q;
}
Suponha, agora, que queremos remover um nó que não é a raiz da árvore. Para remover
o filho esquerdo de um nó x faça:
x->esq = removeraiz (x->esq);
E para remover o filho direito de x faça:
x->dir = removeraiz (x->dir);

DIRETO DO CONCURSO
1. (COSEAC/UFF/TÉCNICO DE TECNOLOGIA DA INFORMAÇÃO/2019) Em relação
à estrutura de dados árvore, avalie se são verdadeiras (V) ou falsas (F) as afirmati-
vas a seguir.

I – O número de nível mais alto de uma árvore é conhecido como grau de uma árvore.
II – Quando um nó possui grau zero, diz-se que ele é um nó terminal ou folha.
III – Árvores são estruturas de dados estáticas em que os dados possuem uma ordem
pré-definida, os elementos são dispostos de acordo com uma hierarquia e existe um
nó principal conhecido como raiz.
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Árvores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

As afirmativas I, II e III são, respectivamente:


a. V, F e V.
b. F, V e F.
c. V, F e F.
d. F, F e F.
e. V, V e F.

COMENTÁRIO
Termos importantes
Grau — O número de subárvores de um nó é o grau do nó. O grau da árvore é o maior valor
de grau de nó entre todos os nós da árvore.
I – O número de nível mais alto de uma árvore é conhecido como grau de uma árvore —
Introdução

II – Quando um nó possui grau zero, diz-se que ele é um nó terminal ou folha —


A estrutura de dados Árvore é uma estrutura que usa ponteiros para representar os nós
filhos, ou seja, trata-se de uma estrutura dinâmica.
A estruturas de dados Árvore não é linear, ou seja, os elementos que as compõem não estão
armazenados de forma sequencial e também não estão todos encadeados como em uma lista.
ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Árvores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Em uma estrutura de dados Árvore cada elemento armazena um tipo de dado e ponteiros
para o elemento à esquerda e à direita, o que permite a inserção dos valores na árvore de
forma recursiva;
III – Árvores são estruturas de dados estáticas em que os dados possuem uma ordem
pré-definida, os elementos são dispostos de acordo com uma hierarquia e existe um nó
principal conhecido como raiz.
20m

GABARITO
1. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ÁRVORES III
ÁRVORES

Travessia

O travessia é um processo de visitar todos os nós de uma árvore e também pode impri-
mir seus valores.
Como todos os nós são conectados por meio de arestas (links), sempre começamos a
partir do nó raiz (cabeça).
Ou seja, não podemos acessar aleatoriamente um nó em uma árvore.
Existem diversas maneiras que usamos para atravessar uma árvore:

• Em ordem;
• Pré-ordem;
• Pós-ordem;
• Por nível.

Geralmente, percorremos uma árvore para pesquisar ou localizar um determinado item


ou chave na árvore ou para imprimir todos os valores que ela contém.
5m

Travessia Em Ordem

Nesse método a subárvore esquerda é visitada primeiro, depois a raiz e depois a subár-
vore direita.
Devemos sempre lembrar que cada nó pode representar uma subárvore em si.
Se uma árvore binária de pesquisa for atravessada em ordem, a saída produzirá valores-
-chave classificados em uma ordem crescente.
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Partimos de A, e seguindo travessia em ordem, passamos para sua subárvore esquerda B.


B também é atravessado em ordem. O processo continua até que todos os nós sejam
visitados. A saída do percurso “em ordem” desta árvore será:
D→B→E→A→F→C→G
10m
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Travessia Em Pré-ordem

Nesse método de travessia, o nó raiz é visitado primeiro, depois a subárvore esquerda e,


finalmente, a subárvore direita.

Partimos de A, e seguindo percurso pré-ordem, nós primeira visitamos o próprio A e


depois passamos para sua subárvore esquerda B.
B também é percorrido em pré-ordem.
O processo continua até que todos os nós sejam visitados. A saída do percurso de pré-
-ordem desta árvore será:
A→B→D→E→C→F→G

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Travessia em Pós-ordem

Neste método travessia, o nó raiz é visitado por último, daí o nome.


Primeiro, atravessamos a subárvore esquerda, depois a subárvore direita e, finalmente,
o nó raiz.
15m

Partimos de A, e seguindo travessia pós-ordem, nós primeira visitamos a subárvore


esquerda B.
B também é atravessado em pós-ordem.
O processo continua até que todos os nós sejam visitados. A saída do percurso pós-or-
dem desta árvore ser:
D→E→B→F→G→C→A

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Travessia por Nível

Em uma árvore binária, o percurso por nível é um percurso denominado “breadth first
search” (BFS) ou em português, busca em largura, a qual seria não recursiva por natureza.
Este percurso utiliza uma fila ao invés de pilha para armazenar os próximos 2 nodos que
devem ser pesquisados (filho à esquerda e à direita).

Com a saída de uma listagem por nível: 8 3 10 1 6 14 4 7 13.

Exemplo 1

20m
ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Exemplo 2

DIRETO DO CONCURSO
1. (2009/CESPE/ANAC/TÉCNICO ADMINISTRATIVO – INFORMÁTICA) A travessia em
pré-ordem em árvore binária inicialmente percorre a subárvore à esquerda (em pré-or-
dem), passa pela raiz e finaliza na subárvore à direita (também em pré-ordem).

COMENTÁRIO
Item errado, pois, na pré-ordem, o nó raiz é visitado primeiro, depois a subárvore esquerda
e, finalmente, a subárvore direita.

2. (2006/CESGRANRIO/PETROBRAS/ANALISTA DE SISTEMAS PLENO – ENGENHA-


RIA DE SOFTWARE) Insira as chaves {Lina, Ana, Lia, Ada, Lua, Sol, Cris, Bia, Rita, Mel,
Rosa, Val} em uma árvore binária de busca (considere que a árvore está inicialmente
vazia). Considere agora, a execução dos seguintes percursos sobre a estrutura após a
inserção das chaves.
ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

I – Um percurso em pré-ordem seria: { Ada, Bia, Cris, Lia, Ana, Mel, Rosa, Rita, Val, Sol,
Lua, Lina}
II – Um percurso em ordem simétrica seria: {Val, Sol, Rosa, Rita, Mel, Lua, Lina, Lia, Cris,
Bia, Ana, Ada}
III – Um percurso em nível seria: {Lina, Ana, Lua, Ada, Lia, Sol, Cris, Rita, Val, Bia,
Mel, Rosa}
IV – Um percurso em pós-ordem seria: {Lina, Ana, Ada, Lia, Cris, Bia, Lua, Sol, Rita, Mel,
Rosa, Val}

Estão corretos apenas os percursos indicados em:


a. I e II.
b. II e III.
c. I, II e III.
d. I, II e IV.
e. II, III e IV.

COMENTÁRIO
Primeiramente, é preciso montar a ordem binária:
25m
ANOTAÇÕES

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Árvores III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Assim:

I – Item errado, pois, na pré-ordem, o percurso começaria com Lina.


II – Item correto, pois a sequência está em ordem alfabética inversa.
III – Item correto, pois esse seria um percurso aceito.
IV – Item errado, pois, na pós-ordem, a raiz é visitada por último.

GABARITO
1. E
2. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ÁRVORES IV

ÁRVORES

As árvores binárias de busca são aquelas em que estão ordenados os elementos, à


esquerda do nó estão os elementos menores do que ele e à direita estão os elementos maio-
res. A árvore binária de busca é interessante para ambientes em que ocorra a inserção de
dados de forma constante e se deseja obter uma busca de forma eficiente.
O vetor já oferece essa busca binária, contudo, ele apresenta um problema, visto que a
inserção de dados nele não é muito eficiente. Isso porque o vetor tem um tamanho fixo inicial
e, ao aumentar o seu tamanho, é necessário movê-lo para outra posição de memória.

Árvores AVL
Caso uma árvore binária seja construída a partir de uma lista ordenada teremos algo como:

A estrutura acima é chamada de degenerada.


5m
O desempenho do pior caso da árvore binária de pesquisa é o mais próximo dos algorit-
mos de pesquisa linear, ou seja, O(n).
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Com dados em tempo real, não podemos prever o padrão de dados e suas frequências.
Portanto, surge a necessidade de balancear as árvores de pesquisa existentes.
Criadas por Adelson-Velsky e Landis, as árvores AVL são uma árvore de pesquisa binária
com balanceamento de altura.
A árvore AVL verifica a altura das subárvores esquerda e direita e garante que a diferença
não seja maior que 1. Essa diferença é chamada de fator de equilíbrio.
Aqui vemos que a primeira árvore está balanceada e as próximas duas não estão
balanceadas:

Na segunda árvore, a subárvore esquerda de C tem altura 2 e a subárvore direita tem


altura 0, então a diferença é 2.
Na terceira árvore, a subárvore direita de A tem altura 2 e a esquerda está ausente, então
é 0 e a diferença é 2 novamente.
A árvore AVL permite que a diferença (fator de equilíbrio) seja apenas 1.
Se a diferença na altura das subárvores esquerda e direita for maior que 1, a árvore
deverá ser equilibrada usando algumas técnicas de rotação.
10m

Rotações AVL
Para se balancear, uma árvore AVL pode executar os quatro tipos de rotações a seguir:

• Rotação esquerda;
• Rotação direita;
• Rotação esquerda-direita;
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

• Rotação direita-esquerda.

As duas primeiras rotações são rotações simples e as duas rotações seguintes são rota-
ções duplas. Para termos uma árvore desequilibrada, precisamos pelo menos de uma árvore
de altura 2. Com uma árvore simples, vamos estudar uma a uma as rotações.

Rotação Esquerda
Se uma árvore ficar desequilibrada, quando um nó é inserido na subárvore direita da
subárvore direita, realizamos uma única rotação esquerda:

Rotação Direita
A árvore AVL pode ficar desequilibrada, se um nó for inserido na subárvore esquerda da
subárvore esquerda. A árvore precisa de uma rotação.
O nó desequilibrado se torna o filho certo do filho esquerdo executando uma rotação direita:

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

15m

Rotação Esquerda-Direita
As rotações duplas são uma versão um pouco complexa das versões já explicadas das
rotações. Para entendê-los melhor, devemos tomar nota de cada ação executada durante a
rotação. Vamos primeiro verificar como executar a rotação esquerda-direita.
Uma rotação esquerda-direita é uma combinação de rotação esquerda seguida por rota-
ção direita. Um nó foi inserido na subárvore direita da subárvore esquerda. Isso faz de C um
nó desequilibrado. Esses cenários fazem com que a árvore AVL execute a rotação esquer-
da-direita. Exemplo a seguir.
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Rotação Direita-Esquerda
O segundo tipo de rotação dupla é a rotação direita-esquerda. É uma combinação de
rotação direita seguida de rotação esquerda.


ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. (2014/IBFC/TRE-AM/ANALISTA JUDICIÁRIO – ANÁLISE DE SISTEMAS) Quanto ao
Algoritmo e estrutura de dados no caso de árvore AVL (ou árvore balanceada pela al-
tura), analise as afirmativas abaixo, dê valores Verdadeiro (V) ou Falso (F) e assinale a
alternativa que apresenta a sequencia correta de cima para baixo:
20m

�(  ) Uma árvore AVL é dita balanceada quando, para cada nó da árvore, a diferença
entre as alturas das suas subárvores (direita e esquerda) não é maior do que um.
�(  ) Caso a árvore não esteja balanceada é necessário seu balanceamento através da

rotação simples ou rotação dupla.

Assinale a alternativa correta:


a. F-F
b. F-V
c. V-F
d. V-V

COMENTÁRIO
A primeira afirmativa é verdadeira, pois a árvore AVL verifica a altura das subárvores es-
querda e direita e garante que a diferença não seja maior que 1.
ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A segunda também é verdadeira, pois as duas primeiras rotações são rotações simples e
as duas rotações seguintes são rotações duplas.T

2. (2006/CESGRANRIO/DECEA/TÉCNICO DE DEFESA AÉREA E CONTROLE DE TRÁ-


FEGO AÉREO – ANÁLISE DE SISTEMAS) Suponha a seguinte árvore AVL.

A inserção do elemento 30 nessa árvore:


a. aumenta a profundidade da árvore após uma rotação.
b. provoca uma rotação à direita.
c. deixa os nós 02 e 07 no mesmo nível.
d. altera a raiz da árvore (nó 41).
e. torna o nó 33 pai do nó 27.

COMENTÁRIO
A inserção do elemento 30 causaria a seguinte reação:
ANOTAÇÕES

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br


ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Árvores IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Em suma, provoca uma rotação à direita.

GABARITO
1. d
2. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 9
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

VETORES I
Referências

 Introdução
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Introdução

Vetor é um contêiner que pode conter um número fixo de itens e esses itens devem ser
do mesmo tipo (Estrutura de Dados Homogênea).
5m
A maioria das estruturas de dados utiliza vetores para implementar seus algoritmos.
A seguir estão os termos importantes para entender o conceito de vetor:

• Elemento – Cada item armazenado em um vetor é chamado de elemento;


• Índice – Cada local de um elemento em um vetor possui um índice numérico, usado
para identificar o elemento.

Representação

Vetores podem ser declarados de diversas formas dependendo da linguagem de progra-


mação, a notação em algoritmo é:
idade:vetor[1..10] de inteiro
Conforme a ilustração acima, a seguir estão os pontos importantes a serem considerados:

• O índice começa com 1;

Obs.: é importante lembrar que o fato de o índice começar com 1 é algo que varia de uma
linguagem de programação para outra. A maioria das linguagens começa a conta-
gem com o 0, contudo, nos algoritmos, em geral se começa com 1.

• O comprimento do vetor é 10, o que significa que pode armazenar 10 elementos;


• Cada elemento pode ser acessado através de seu índice. Por exemplo, podemos
buscar um elemento no índice 6 como 9.
10m

É um conjunto de variáveis do mesmo tipo acessíveis com um único nome.


Armazenadas de forma contínua e ocupando as posições de forma fixas.
Pode-se dizer que vetor é uma matriz unidimensional.
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

OPERAÇÕES BÁSICAS

A seguir estão as operações básicas suportadas por um vetor:

• Travessia – Imprime todos os elementos do vetor, um por um;


• Inserção – Adiciona um elemento ao índice especificado;
• Exclusão – Exclui um elemento no índice especificado;
• Pesquisa – Pesquisa um elemento usando o índice fornecido ou pelo valor;
• Atualização – Atualiza um elemento no índice especificado.

Travessia
15m

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Inserção

A operação de inserção consiste em inserir um ou mais elementos de dados em um vetor;


Com base no requisito, um novo elemento pode ser adicionado no início, no final ou em
qualquer índice do vetor.
Segue uma implementação prática da operação de inserção, na qual adicionamos dados
no final do vetor.

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

20m

Exclusão
Exclusão refere-se à remoção de um elemento existente e à reorganização de todos os
elementos remanescentes.


ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Pesquisa

A pesquisa, dado um array, visa descobrir se um elemento existe em uma dada posição
ou não. O algoritmo abaixo mostra uma pesquisa sequencial:
ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Atualização
A atualização visa trocar o valor de um elemento.
25m

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. (2010/CESPE/BANCO DA AMAZÔNIA/TECNOLOGIA DA INFORMAÇÃO – ANÁLISE
DE SISTEMAS)

Considere o algoritmo acima, em que M[ ] seja um vetor de valores inteiros e A e B


sejam dois valores inteiros e o primeiro elemento do vetor M esteja localizado na posi-
ção 1, sendo os argumentos passados por referência. Com base nessas informações,
julgue os itens a seguir.
Se X for um vetor com os elementos [1, 2, 4, 8, 16, 32, 64, 128], a chamada da função
func(X,2,6) retornará o valor 62.
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Vetores I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMENTÁRIO
Item correto, pois o cálculo que será realizado é:.

2. (2010/CESPE/ABIN/OFICIAL TÉCNICO DE INTELIGÊNCIA – ÁREA DE SUPORTE A


REDE DE DADOS) Um array é um conjunto de elementos de tipos homogêneos, ou
seja, todos os seus elementos são do mesmo tipo de dados. Uma estrutura, ou registro,
é um conjunto de elementos heterogêneos, porque seus elementos não são obrigato-
riamente do mesmo tipo de dados.

COMENTÁRIO
Item correto, pois vetor é um contêiner que pode conter um número fixo de itens e esses
itens devem ser do mesmo tipo (Estrutura de Dados Homogênea).
Além disso, Structs, também conhecidas como Registros, definem tipos de dados que
agrupam variáveis sob um mesmo tipo de dado.
30m
A ideia de usar uma struct é permitir que, ao armazenar os dados de uma mesma entidade,
isto possa ser feito com uma única variável.
Por exemplo, se for preciso armazenar a altura, o peso e a idade de uma pessoa, pode-se
criar uma struct chamada Pessoa e agrupar os dados em um único tipo de dado.
Uma vez que armazena vários tipos de dados distintos, é considerada uma Estrutura de
Dados Heterogênea.

GABARITO
1. C
2. C

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 9
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

VETORES II

LISTAS

Referências


ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Listas Encadeadas
Uma lista encadeada é uma representação de uma sequência de objetos, todos do
mesmo tipo, na memória RAM (random access memory) do computador.
Cada elemento da sequência é armazenado em uma célula da lista: o primeiro elemento
na primeira célula, o segundo na segunda, e assim por diante.
Uma lista encadeada (linked list – lista ligada) é uma sequência de células; cada célula
contém um objeto (todos os objetos são do mesmo tipo) e o endereço da célula seguinte.
Cada célula é um registro que pode ser definido assim:

5m

Obs.: o vetor é bastante útil e tem um acesso aleatório bastante rápido. No entanto, ele
possui uma limitação grave, que é o fato de não ser possível incluir mais elemen-
tos além do que foi determinado no início. A inclusão de mais um elemento em um
array depende, portanto, da alocação de um outro vetor com um tamanho maior e
transferir os valores de um vetor para o outro, isso para cada novo elemento que
se deseja inserir. Isso torna as coisas lentas. Assim, a lista ligada é uma alternativa
para situações em que se deseja a inserção rápida de elementos. Todavia, a lista
ligada apresenta uma desvantagem, pois é muito caro realizar o acesso aleatório a
algum elemento.

Representação
A lista encadeada pode ser visualizada como uma cadeia de nós, onde cada nó aponta
para o próximo nó:
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A lista encadeada contém um elemento chamado primeiro.


Cada link carrega um(s) campo(s) de dados e um campo de link chamado a seguir.
Cada link é vinculado ao seu próximo link usando seu próximo link.
O último link carrega um link como nulo para marcar o final da lista.

Tipos de Lista Encadeada:


• Lista encadeada simples – A navegação de itens é apenas para frente;
• Lista duplamente encadeada – Os itens podem ser navegados para frente e para trás;
10m
• Lista encadeada circular – É uma lista duplamente encadeada onde o último item
contém o link do primeiro elemento como próximo e o primeiro elemento tem um link
para o último elemento como anterior.

Endereço de uma lista encadeada


O endereço de uma lista encadeada é o endereço de sua primeira célula.
Se le é o endereço de uma lista encadeada, convém dizer simplesmente que le é uma
lista encadeada.
A lista está vazia (ou seja, não tem célula alguma) se e somente se le == NULL.

Obs.: vale lembrar que, no caso de um vetor, quando se declara uma quantidade grande
de elementos com o intuito de fazer o uso na medida da necessidade, gera-se um
problema, pois o custo de memória inicial será alto. Já em uma lista encadeada é
diferente, pois a alocação da memória ocorre na medida em que os elementos são
inseridos.

Recursividade
Listas são estruturas eminentemente recursivas.
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Para tornar isso evidente, basta fazer a seguinte observação: se le é uma lista não vazia
então le->prox também é uma lista.
Muitos algoritmos sobre listas encadeadas ficam mais simples quando escritos em estilo
recursivo.
Exemplo: a seguinte função recursiva imprime o conteúdo de uma lista encadeada le:
15m

E aqui está a versão iterativa da mesma função:

Operações Básicas:
• Inserção – Insere um elemento no início da lista;
• Exclusão – Exclui um elemento da lista;
• Imprimir – Exibe a lista completa;
• Pesquisar – Pesquisa um elemento usando a chave fornecida.
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Inserção

Obs.: percebe-se que o custo computacional é menor nessa operação de inserção se com-
parado ao custo de um vetor.

Esta função recebe uma lista encadeada le com cabeça e insere na lista uma nova célula
imediatamente antes da primeira que contém y.
Se nenhuma célula contém y, insere a nova célula no fim da lista. O conteúdo da nova
célula é x.
ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Exclusão
20m


Esta função recebe uma lista encadeada le com cabeça e remove da lista a primeira
célula que contiver y, se tal célula existir.

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Pesquisa
ANOTAÇÕES

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. (2012/CESPE/BANCO DA AMAZÔNIA CARGO/TÉCNICO CIENTÍFICO – ADMINIS-
TRAÇÃO DE DADOS) As listas duplamente encadeadas diferenciam-se das listas sim-
plesmente encadeadas pelo fato de, na primeira, os nós da lista formarem um anel com
o último elemento ligado ao primeiro da lista.

COMENTÁRIO
Quem faz a ligação entre o primeiro elemento e o último elemento é a lista encadea-
da circular.

2. (2009/COSEAC/DATAPREV/ANALISTA DE TECNOLOGIA DA INFORMAÇÃO –


DESENVOLVIMENTO DE SISTEMAS) Sobre listas encadeadas, é INCORRETO
afirmar que:
a. Os dados são armazenados dinamicamente;
b. São acessadas pelo primeiro nodo da lista;
c. O final da lista faz uma referência para null;
d. Possuem tamanho fixo;
e. Pilhas e filas são versões limitadas de listas encadeadas.

COMENTÁRIO
Não há tamanho fixo, pois são permitidas operações de inclusão e exclusão.
25m

3. (2019/CCV-UFC/UFC/TÉCNICO DE TECNOLOGIA DA INFORMAÇÃO) Um dos exem-


plos de estrutura de dados é a lista encadeada simples. Com relação a esse tipo de
lista, é correto afirmar:
a. Possui a característica de que o último elemento da lista possui um ponteiro para o
primeiro elemento da lista.
b. É necessário definir o seu tamanho no momento da sua criação, pois se trata de uma
estrutura de dados estática.
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Vetores II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

c. Quando essa estrutura é utilizada, os elementos da lista sempre estarão armazena-


dos sequencialmente na memória física.
d. Na inserção de um novo elemento, é necessário realizar a atualização dos ponteiros
dos elementos envolvidos, não sendo necessário realizar o deslocamento físico dos
elementos.
e. Na recuperação de qualquer elemento da lista, não é necessário percorrer os outros
elementos. Dessa forma, o elemento buscado é acessado diretamente na posição
onde se encontra.

COMENTÁRIO
a) Na realidade, isso acontece na lista encadeada circular.
b) A estrutura de dados é dinâmica.
c) Os elementos estão dispersos na memória física.
d) O disposto no item está correto.
e) Na realidade, na lista ligada ocorre justamente o contrário.

GABARITO
1. E
2. d
3. d

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 9
DESENVOLVIMENTO WEB
Algoritmos de Busca
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE BUSCA

O algoritmo de busca é uma maneira de buscar, ou seja, de procurar um elemento dentro


de um conjunto de elementos.

Referências

Esse é um dos livros mais clássicos quando o assunto é estrutura de dados.


5m

Introdução

Um algoritmo de busca é um método para se pesquisar grandes quantidades de dados


e encontrar determinada informação. É importante lembrar que cada vez mais informação é
armazenada em um computador, sendo assim, é importante que os algoritmos sejam otimi-
zados para conseguir encontrar os dados necessários.
ANOTAÇÕES

www.grancursosonline.com.br 1
DESENVOLVIMENTO WEB
Algoritmos de Busca
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Imagine ter que encontrar uma palavra em um dicionário que não está organizado. O tra-
balho seria imenso, por isso é importante que as informações estejam organizadas para que
o algoritmo de busca funcione rapidamente.
Certos métodos de organizar dados tornam o processo de busca mais eficiente. Algorit-
mos de ordenação estão relacionados aos algoritmos de busca, pois agilizam o processo de
encontrar as informações necessárias.
Como a operação de busca é uma tarefa muito comum em computação, o conhecimento
de métodos é um passo importante para a formação de um bom programador.
10m
Um algoritmo de busca é aquele que aceita um argumento e tenta encontrar o registro
cuja chave seja este argumento.
É possível que a busca de determinado elemento não tenha sucesso, ou seja, talvez não
exista nenhum registro dentro da tabela com esse argumento como chave.
Nesse caso, o algoritmo pode retornar um “registro nulo”.
Como estamos falando de algoritmos, não estamos falando em implementações específi-
cas em determinada linguagem. Para cada linguagem de programação vai existir uma forma
que será retornada.

Busca Sequencial ou Linear

A busca linear é um algoritmo de busca muito simples;


Nesse tipo de busca, é feita uma busca sequencial em todos os itens, um por um;
Cada item é verificado e, se uma correspondência for encontrada, esse item específico
será retornado; caso contrário, a pesquisa continuará até o final da coleta de dados;

15m

É importante saber que essa busca percorre os elementos um a um no sentido da ordem


do vetor ou da lista.
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO WEB
Algoritmos de Busca
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Eficiência da Busca Sequencial

O número de comparações dependerá de onde o registro com a chave do argumento


aparecer na tabela.
Se o registro for o primeiro na tabela, só será efetuada uma comparação; se o registro for
o último a tabela, serão necessárias “n” comparações.
Se for igualmente provável que o argumento apareça em qualquer posição determinada
da tabela, uma busca de sucesso exigirá (em média) (n + 1)/2 comparações, e uma busca
sem êxito exigirá “n” comparações.
Em qualquer caso, o número de comparações será O(n).

Busca Sequencial em C

Note que a pesquisa sequencial funciona para pesquisas não ordenadas, pois varre o
vetor do início ao fim. Porém seu custo é O(n), porque quanto maior for (n) maior será o
custo, ou seja, o custo é diretamente proporcional ao número de elementos no vetor.

Busca Sequencial em Tabela Ordenada

A eficiência da operação de busca melhora se as chaves dos registros estiverem


ordenadas.
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO WEB
Algoritmos de Busca
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

No pior caso (caso em que a chave não é encontrada), são necessárias “n” comparações
quando as chaves estão desordenadas.
No caso médio, N/2 comparações se as chaves estiverem ordenadas, pois se para a
busca assim que uma chave maior do que a procurada é encontrada.
20m

Uma vez que o algoritmo percorre a lista e percebe que o elemento que está sendo per-
corrido é maior que o elemento pretendido, já é possível parar a pesquisa.

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO WEB
Algoritmos de Busca II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE BUSCA II

Reordenação para Melhor Eficiência

Em geral, ao se aplicar um algoritmo de busca sobre uma lista não ordenada, o algoritmo
terá problemas na hora de sua execução. É importante lembrar que alguns algoritmos fun-
cionam para listas ordenadas e não ordenadas, mas outros apenas para listas ordenadas.

ATENÇÃO
A busca sequencial funciona tanto para lista ordenada quanto para não ordenada.

Embora seja habitual a recuperação de determinados registros com mais frequência do


que outros, é quase impossível identificar tais registros antecipadamente.
Além disso, a probabilidade de que determinado registro seja recuperado pode mudar
com o passar do tempo.
Sendo assim, seria útil ter um algoritmo que ordenasse continuamente a tabela de modo
que os registros mais acessados fossem deslocados para o início, enquanto os acessados
com menos frequência fossem deslocados para o final.
5m
Mesmo trabalhando com busca sequencial e registros não ordenados, à medida que os
registros forem sendo buscados, o sistema pode movê-los de lugar e colocá-los no início
da lista para um acesso mais rápido. Sendo assim, é possível encontrar cenários em que a
busca sequencial é mais adequada.
Existem dois métodos de busca que fazem essa operação.
Um deles é conhecido como método mover-para-frente. Nesse método, sempre que uma
pesquisa obtiver êxito o registro recuperado será removido de sua atual posição na lista e
colocado no início da lista.
É importante lembrar que o termo “mover-para-frente” significa levar o registro para o
início da lista, pois na próxima busca ele será encontrado com maior eficiência.
O outro método é a transposição, na qual um registro recuperado com sucesso é trocado
pelo registro imediatamente anterior.
Esses dois métodos se baseiam no fenômeno observado de que um registro recuperado
será provavelmente recuperado outra vez.
ANOTAÇÕES

www.grancursosonline.com.br 1
DESENVOLVIMENTO WEB
Algoritmos de Busca II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Avançando tais registros para o início da tabela, as recuperações subsequentes serão


mais eficientes.
O raciocínio do método mover-para-frente é que, como o registro será provavelmente
recuperado mais uma vez, ele deve ser colocado na posição dentro da tabela na qual a recu-
peração seja mais eficiente.
Entretanto, o contra-argumento do método de transposição é que uma única recuperação
não implica necessariamente que o registro será recuperado frequentemente. posicioná-lo
no início da tabela reduzirá a eficiência da busca de todos os outros registros que o precede-
ram anteriormente.
Essas são buscas que dependem do comportamento de utilização do sistema. O mover
para frente adiciona um peso máximo ao registro que tem apenas uma busca. A transposição
é mais equilibrada, pois os registros são lentamente levados para o início da lista à medida
que são buscados.
10m
Avançando um registro apenas uma posição sempre que ele for recuperado, garante-se
que ele avançará para o início da lista apenas se recuperado com frequência.
Para um grande número de solicitações de busca com uma distribuição inalterada de pro-
babilidade, o método de transposição é mais eficiente.
Já o método mover-para-frente dá melhores resultados para um número pequeno a
médio de solicitações e responde mais rapidamente a uma mudança na distribuição da pro-
babilidade.
Por essa razão, o método de mover-para-frente é preferido na maioria das situações que
exige a busca sequencial.

Busca Ordenada

Se a lista estiver em ordem ascendente ou decrescente, várias técnicas poderão ser


empregadas para aumentar a eficiência da operação de busca.
Uma vantagem evidente ao pesquisar uma lista classificada em comparação a uma
não classificada é no caso em que a chave do argumento está ausente.
No caso de uma lista não classificada, são necessárias “n” comparações para detectar
esse fato. No caso de uma lista classificada, só serão necessárias “n/2” comparações (em
média). Na lista ordenada, ao chegarmos no meio da lista, se o elemento não for encontrado,
é possível inferir que o elemento também não será encontrado dali para frente.
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO WEB
Algoritmos de Busca II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Isso acontece pois sabemos que determinada chave está ausente numa lista classificada
em ordem ascendente de chaves assim que se encontra uma chave maior que o argumento.

Busca Sequencial Indexada


15m

Existe uma tabela auxiliar, chamada tabela de índices, além do próprio arquivo ordenado.
Essa tabela faz o registro dos índices dos registros mais acessados na tabela principal.
Cada elemento na tabela de índices contém uma chave (kindex) e um indicador do regis-
tro no arquivo que corresponde a kindex.
Faz-se a busca a partir do ponto indicado na tabela, sendo que a busca não precisa ser
feita desde o começo.
Pode ser implementada como um vetor ou como uma lista encadeada.
O indicador da posição na tabela pode ser um ponteiro ou uma variável inteira.

Se a tabela for muito grande, pode-se ainda usar a tabela de índices secundária.
O índice secundário é um índice para o índice primário.
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO WEB
Algoritmos de Busca II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

É importante perceber que, apesar de parecer um algoritmo dispendioso, o computador


trabalha com milhões de registros e isso pode facilitar o seu trabalho.

Vantagens:

• Os itens na tabela poderão ser examinados sequencialmente sem que todos os regis-
tros precisem ser acessados;
• O tempo de busca diminui consideravelmente.

Desvantagens:

• A tabela tem que estar ordenada;


• Exige espaço adicional para armazenar a(s) tabela(s) de índices.

Após a inserção ou remoção de elementos da tabela os índices devem ser rearranjados.


20m
ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO WEB
Algoritmos de Busca II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. (2010/CESPE/Banco da Amazônia/Técnico Científico/Tecnologia da Informação/Admi-
nistração de Dados) A pesquisa sequencial é aplicável em estruturas não ordenadas.

COMENTÁRIO
É necessário lembrar que a pesquisa sequencial pode ser realizada sobre dados não
ordenados.

2. (2018/CESPE/BNB/Especialista Técnico/Analista de Sistema) O algoritmo a seguir


apresenta um exemplo de busca sequencial.
ANOTAÇÕES

www.grancursosonline.com.br 5
DESENVOLVIMENTO WEB
Algoritmos de Busca II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMENTÁRIO
A busca sequencial possui um laço de repetição que tenta identificar o elemento procurado.
Perceba que o algoritmo dado possui dois laços. O algoritmo nem chega a retornar
nada, mas apenas imprime o resultado. Esse é um algoritmo que faz a ordenação e não
uma busca.
Busca Sequencial em C

GABARITO
1. C
2. E

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 6
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE BUSCA III

Busca Binária

O método mais eficiente de pesquisar uma lista ordenada sem usar índice ou tabelas
auxiliares é a busca binária. É interessante notar que a busca binária é realizada em uma
lista ordenada.
Em termos básicos, o argumento é comparado à chave do elemento do meio da tabela.
Se forem iguais, a busca terminará com sucesso. Caso contrário, a metade superior ou a
metade inferior da tabela deverá ser pesquisada de modo semelhante.
A busca binária pode ser definida recursivamente.
Entretanto, é possível que a sobrecarga associada à recursividade a torne inadequada
para uso em situações práticas nas quais a eficiência é uma consideração primordial. Apesar
de a recursividade nos trazer soluções com bastante elegância, ela é pesada computacional-
mente em relação ao gasto de memória.
5m

É importante lembrar que a recursividade é a possibilidade de um método chamar a


si próprio.
ANOTAÇÕES

www.grancursosonline.com.br 1
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br


Uma pesquisa binária que busque o número 47 encontrará o número 14 na primeira cha-
mada. Na segunda chamada, ela encontrará o número 45. Na terceira chamada, ela encon-
trará o número 47.

Eficiência da Busca Binária

Cada comparação na busca binária reduz o número de possíveis candidatos por um


fator de 2.
Sendo assim, o número máximo de comparações de chave é aproximadamente log2n.
Sendo assim, podemos afirmar que o algoritmo de busca é O(log n).
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

10m

Busca por Interpolação

Se as chaves estiverem uniformemente distribuídas dentro da lista, a pesquisa por inter-


polação pode ser ainda mais eficiente do que a binária.
O algoritmo é o mesmo da pesquisa binária, adotando-se a fórmula abaixo para o cálculo
da variável “meio” (que neste caso não será obrigatoriamente o meio da tabela):
meio = ini + ((fim-ini)*(chave-v[ini])) / (v[fim]-v[ini])
Esse código poderá de uma melhor forma e, com isso, é mais eficiente no cálculo da
variável meio.
Se as chaves estiverem uniformemente distribuídas pelo vetor, a busca por interpolação
exigirá uma média de log2(log2 n) comparações e raramente precisará de mais comparações
quando comparada com log2 n da busca binária.
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Entretanto, se as chaves não estiverem uniformemente distribuídas, a busca por interpo-


lação poderá apresentar um comportamento médio muito deficiente cujo caso a busca por
interpolação resultará em uma busca sequencial.
15m

Tabela de Hash/Espalhamento

É uma estrutura de dados que armazena dados de maneira associativa. Essa estrutura
associa uma chave a um índice.
Em uma tabela de hash, os dados são armazenados em um formato de vetor, em que
cada valor de dados tem seu próprio valor de índice exclusivo.
O acesso aos dados se torna muito rápido se conhecermos o índice dos dados desejados.
Assim, torna-se uma estrutura de dados na qual as operações de inserção e pesquisa
são muito rápidas, independentemente do tamanho dos dados.
A tabela de hash usa um vetor como meio de armazenamento e usa a técnica de hash
para gerar um índice no qual um elemento deve ser inserido ou a partir do qual ele deve ser
localizado.
É necessário entender que o hashing é uma técnica para converter um intervalo de valo-
res-chave em um intervalo de índices de um vetor.
Pode-se usar o módulo operador para obter uma variedade de valores-chave.
Por exemplo, uma tabela de tamanho 20 e os seguintes itens devem ser armazenados,
onde os itens estão no formato chave/valor.
Pra cada chave, há uma função de hashing que devolve um índice.
ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

20m

As colisões ocorrem quando dois elementos colidem para a mesma posição do vetor.
Existem dois métodos básicos para tratar colisões de espalhamento.
A primeira técnica, chamada reespalhamento, requer o uso de uma função de espalha-
mento secundária sobre a chave de espalhamento do item.
A função de reespalhamento é aplicada sucessivamente até ser encontrada uma posição
vazia onde o item possa ser inserido.
Se a posição de espalhamento do item estiver ocupada durante uma pesquisa, a função
de reespalhamento será usada novamente para achar o item.
ANOTAÇÕES

www.grancursosonline.com.br 5
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A segunda técnica, chamada encadeamento, forma uma lista ligada de todos os itens
cujas chaves se espalharam nos mesmos valores.
Durante a busca, essa pequena lista ligada é percorrida sequencialmente, procurando a
chave desejada.
Essa técnica requer a inclusão de um campo de ligação adicional em cada posição
da tabela.

Encadeamento

Boas e más funções de espalhamento

Qualquer função que leva qualquer chave no intervalo 0..M-1 de índices serve como
função de espalhamento.
Mas uma tal função só é eficiente se espalhar as chaves pelo intervalo de índices de
maneira razoavelmente uniforme.
ANOTAÇÕES

www.grancursosonline.com.br 6
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Por exemplo, se as chaves são números inteiros e todas são múltiplos de 100 (ou seja,
todas terminam com 00) então v % 100 é uma péssima função de espalhamento (causará
muitas colisões).
Uma boa função de espalhamento é essencial para garantir boa performance em tabelas
de espalhamento.
Uma função de espalhamento não adequada para as chaves em questão tende a degra-
dar o desempenho geral da tabela de espalhamento.
Um requisito básico para garantir o bom desempenho da função de espalhamento é que
ela deve prover uma distribuição uniforme dos valores de espalhamento.
Uma distribuição não uniforme tende a aumentar o número de colisões assim como o
custo associado para resolvê-las.
25m

DIRETO DO CONCURSO
1. (2019/IDECAN/IF-PB/Professor/Informática) Basicamente, existem dois métodos de
pesquisa em um vetor de números, a Busca Linear e a Busca Binária. A Busca Binária
é mais eficiente do que a Busca Linear, mas ela só funciona se o vetor estiver ordena-
do. Assinale a alternativa que indique a ordem de complexidade do pior caso da Busca
Binária em um vetor de n números ordenados.
a. O(n)
b. O(n log n)
c. O(log n)
d. O(1)
e. O(n^2)

COMENTÁRIO
Cada comparação na busca binária reduz o número de possíveis candidatos por um fa-
tor de 2. Sendo assim, o número máximo de comparações de chave é aproximadamente
log2n. Sendo assim, podemos afirmar que o algoritmo de busca é O(log n).

2. (2015/COSEAC/UFF/Técnico de Tecnologia da Informação) Em relação aos algoritmos


de pesquisa em um vetor de N elementos, é correto afirmar que:
a. a pesquisa binária não necessita que o vetor esteja previamente ordenado.
ANOTAÇÕES

www.grancursosonline.com.br 7
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

b. a busca por interpolação é mais adequada quando existe uma distribuição não uni-
forme nas chaves.
c. a busca sequencial possui tempo médio da ordem de log2N (log N na base 2).
d. a pesquisa binária possui uma quantidade máxima de buscas da ordem de N/2.
e. o hashing é considerado tanto um método de busca quanto um método de ordenação.

COMENTÁRIO
A busca binária é o método mais eficiente de pesquisar uma lista ordenada sem usar índice
ou tabelas auxiliares é a busca binária. Em termos básicos, o argumento é comparado à
chave do elemento do meio da tabela. Se forem iguais, a busca terminará com sucesso.
Caso contrário, a metade superior ou a metade inferior da tabela deverá ser pesquisada
de modo semelhante.
Em relação à busca por interpolação, se as chaves estiverem uniformemente distribuídas
dentro da lista, a pesquisa por interpolação pode ser ainda mais eficiente do que a binária.
O algoritmo é o mesmo da pesquisa binária, adotando-se a fórmula abaixo para o cálculo
da variável “meio” (que neste caso não será obrigatoriamente o meio da tabela):
meio = ini + ((fim-ini)*(chave-v[ini])) / (v[fim]-v[ini]).
O número de comparações em uma busca sequencial dependerá de onde o registro com
a chave do argumento aparece na tabela. Se o registro for o primeiro na tabela, só será
efetuada uma comparação. se o registro for o último a tabela, serão necessárias “n” com-
parações. Se for igualmente provável que o argumento apareça em qualquer posição de-
terminada da tabela, uma busca de sucesso exigirá (em média) (n + 1)/2 comparações, e
uma busca sem êxito exigirá “n” comparações. Em qualquer caso, o número de compara-
ções será O(n).
É importante lembrar que cada comparação na busca binária reduz o número de possíveis
candidatos por um fator de 2. Sendo assim, o número máximo de comparações de cha-
ve é aproximadamente log2n. Sendo assim, podemos afirmar que o algoritmo de busca
é O(log n).
A Tabela de Hash ou Espalhamento é uma estrutura de dados que armazena dados de
maneira associativa. Em uma tabela de hash, os dados são armazenados em um formato
de vetor, em que cada valor de dados tem seu próprio valor de índice exclusivo. O acesso
aos dados se torna muito rápido se conhecermos o índice dos dados desejados. Assim,
ANOTAÇÕES

www.grancursosonline.com.br 8
DESENVOLVIMENTO WEB
Algoritmos de Busca III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

torna-se uma estrutura de dados na qual as operações de inserção e pesquisa são muito
rápidas, independentemente do tamanho dos dados.

GABARITO
1. c
2. e

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conte-
údo ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura
exclusiva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 9
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE BUSCA IV

Árvore Binária de Buscas

É importante notar que a árvore binária de buscas é diferente da árvore de dados. A


árvore binária de buscas é um tipo especial de árvore binária.
É construída de tal forma que, para cada nó:

• Nós com chaves menores estão na sub-árvore esquerda;


• Nós com chaves maiores (ou iguais) estão na sub-árvore direita.

A inserção ou remoção dos nós da árvore deve satisfazer a essa propriedade.


Para a busca de uma chave v na árvore binária de busca:

• Primeiro compare com a raiz;


• Se menor, vá para a sub-árvore esquerda;
• Se maior, para a sub-árvore direita.

Aplica-se o método recursivamente.


5m
ANOTAÇÕES

www.grancursosonline.com.br 1
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A cada passo, garante-se que nenhuma outra parte da árvore contém a chave
sendo buscada.
O procedimento para quando:

• O nó com v é encontrado;
• Senão, chega-se a NULL.
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Essa busca é um pouco parecida com a busca binária, no entanto existe uma caracte-
rística interessante: inserir elementos na árvore é mais rápido do que inserir em uma lista
ordenada e manter sua ordenação.

Inserção em Árvore Binária de Busca

Para inserir um nó na árvore:

• Fazer uma busca com insucesso;


• Alocar um novo nó;
• É necessário saber por qual nó se chegou a NULL:
– Será o pai do novo nó.
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

10m

Remoção em Árvore Binária de Busca

Remoção de um nó folha: a exclusão na folha é a mais simples, basta removê-lo da árvore.

A remoção de nó com um filho é realizada excluindo o nó pai. Nesse caso, o nó filho sobe
para a posição do pai.
ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Na remoção de nó com dois filhos, pode-se operar de duas maneiras diferentes:

• Pode-se substituir o valor do nó a ser retirado pelo valor sucessor (o nó mais à


esquerda da subárvore direita) ou pelo valor antecessor (o nó mais à direita da subár-
vore esquerda), removendo-se aí o nó sucessor (ou antecessor).

Eficiência Das Operações De Árvore De Busca Binária

O tempo necessário para pesquisar em uma árvore de busca binária varia entre O(n) e
O(log n), dependendo da estrutura da árvore. Lembre-se de que O(n) é o custo computacio-
nal da busca sequencial, por outro lado, O(log n) é o tempo da busca binária. É importante
notar que a busca pode ser mais ou menos eficiente a depender da estrutura da árvore.
Se os registros forem inseridos em ordem classificada, a árvore resultante conterá todas
as ligações esquerdas (ou direitas) nulas, de modo que a busca da árvore se reduzirá a uma
busca sequencial.
15m
Entretanto, se os registros forem inseridos de modo a ser alcançada uma árvore balan-
ceada, aproximadamente log n comparações serão suficientes para recuperar um elemento.

DIRETO DO CONCURSO
1. (2010/CESPE/BANCO DA AMAZÔNIA/TECNOLOGIA DA INFORMAÇÃO/ANÁLISE DE
SISTEMAS) Em uma árvore binária de busca, como em toda árvore binária, todos os
nós têm grau máximo igual a 2. Entretanto, nem toda árvore binária pode ser conside-
rada uma árvore binária de busca.
ANOTAÇÕES

www.grancursosonline.com.br 5
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMENTÁRIO
Uma árvore binária é uma estrutura de dados de árvore na qual cada nó tem no máximo
dois filhos, chamados de filho esquerdo e filho direito.

Árvore Binária de Buscas é construída de tal forma que, para cada nó:

• Nós com chaves menores estão na sub-árvore esquerda;


• Nós com chaves maiores (ou iguais) estão na sub-árvore direita;
• A inserção dos nós da árvore deve satisfazer a essa propriedade.

É necessário lembrar que nem toda árvore binária pode ser considerada uma árvore biná-
ria de busca.
ANOTAÇÕES

www.grancursosonline.com.br 6
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

2. (2010/CESGRANRIO/PETROBRAS/ANALISTA DE SISTEMAS JÚNIOR/PROCESSOS


DE NEGÓCIOS) Uma lista ordenada de N números é inserida em uma pilha e depois
retirada, sendo que, a cada POP, o elemento retirado é inserido em uma árvore de bus-
ca binária. Após a completa inserção de todos os elementos nesta árvore, são feitas
buscas de números na mesma. O tempo médio de busca de um número nesta árvore é
a. O(1)
b. O(log N)
c. O(N)
d. O(Nlog N)
e. O(N2)
20m

A estrutura de pilha é semelhante a uma pilha de pratos, em que o último elemento inserido
é o primeiro a ser retirado.
Em relação à eficiência das operações de árvore de busca binária, o tempo necessário
para pesquisar em uma árvore de busca binária varia entre 0(n) e O(log n), dependendo
da estrutura da árvore.
Se os registros forem inseridos em ordem classificada, a árvore resultante conterá todas as
ligações esquerdas (ou direitas) nulas, de modo que a busca da árvore se reduzirá a uma
busca sequencial.
ANOTAÇÕES

www.grancursosonline.com.br 7
DESENVOLVIMENTO WEB
Algoritmos de Busca IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Entretanto, se os registros forem inseridos de modo a ser alcançada uma árvore balance-
ada, aproximadamente log n comparações serão suficientes para recuperar um elemento.

GABARITO
1. C
2. c

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conte-
údo ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura
exclusiva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE ORDENAÇÃO I

Algoritmo de ordenação basicamente se propõe a ordenar uma lista. Exemplo: um bara-


lho misturado que precisa ser ordenado.
Trata-se de um processo que possui várias abordagens distintas, cada qual com o custo
computacional diverso. E mesmo que alguns sejam mais rápidos, todos chegarão no mesmo
final: ordenar a lista.

Referência

Introdução

A ordenação se refere à organização dos dados em um formato específico. Ordenação


não precisa ser numérica, podendo haver uma ordem natural dos elementos. O importante
é que, dentro da lista, todos os elementos estejam obedecendo a ordenação e ser com-
paráveis.
5m
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O algoritmo de classificação especifica a maneira de organizar os dados em uma ordem


específica. As ordens mais comuns estão em ordem numérica (1, 2, 3 etc) ou lexicográfica
(ordem alfabética).
A importância da classificação está no fato de que a pesquisa de dados pode ser otimi-
zada para um nível muito alto, se os dados forem armazenados de maneira classificada.
Em geral, interessa-se na ordenação dos dados para efetuar uma pesquisa mais efi-
ciente. Exemplo disso é que um método de busca ordenada possui uma maior potência em
termos de eficiência.

Ordenação In-place e Not-in-place

Os algoritmos de classificação podem exigir algum espaço extra para comparação e


armazenamento temporário de poucos elementos de dados.
Esses algoritmos não requerem espaço extra e a ordenação ocorre no local, ou por exem-
plo, dentro do próprio vetor.
Isso é chamado de classificação in-place. A classificação por bolha é um exemplo de
classificação in-place. Outro exemplo pode ser visto nas cartas de baralho: imagine juntar as
cartas, misturando-as sem que as cartas saiam das mãos de quem as mistura.
No entanto, em alguns algoritmos de classificação, o programa requer espaço igual ou
superior aos elementos que estão sendo classificados. A classificação que utiliza espaço
igual ou maior é chamada de classificação no-tin-place;
A classificação por mesclagem (merge sort) é um exemplo de classificação not-in-place;
Exemplo: ao embaralhar um baralho, nas mesas a pessoa começa a separar as cartas
por naipes. Com o computador ocorre o mesmo: pode-se separar dados em outras alocações
de memórias para realizar ordenações intermediárias e chegar a uma ordenação final.

Classificação Estável e Não Estável

Se um algoritmo de classificação, depois de classificar o conteúdo, não altera a sequên-


cia de conteúdo repetido que aparece, é chamado de classificação estável.
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Se um algoritmo de classificação, depois de classificar o conteúdo, alterar a sequência de


conteúdo repetido que aparece, é chamado de classificação instável.
10m

Se o 26 azul estava antes do 26 roxo, aquele continuará na mesma ordem.


Imagine que se esteja misturando dois baralhos com cores diferentes e pela face. Se as
cartas que eram iguais não mudaram de lugar ao serem embaralhadas, tem-se uma classi-
ficação estável.
Classificação não estável: no momento de mistura de um baralho de cores distintos, não
há garantia de que as cartas estarão nas mesmas posições originais.
A estabilidade de um algoritmo é importante quando queremos manter a sequência de
elementos originais, como em uma tupla, por exemplo.

Algoritmo de Classificação Adaptativa e Não Adaptativa

Diz-se que um algoritmo de classificação é adaptável, se tirar proveito dos elementos já


‘classificados’ na lista a ser classificada.
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Ao classificar, se a lista de fontes já possui algum elemento classificado, algoritmos adap-


tativos levarão isso em consideração e tentarão não os reordenar.
Um algoritmo não adaptativo é aquele que não leva em consideração os elementos que
já estão classificados.
Eles tentam forçar todos os elementos a serem reordenados para confirmar sua
classificação.
Exemplo da carta: o algoritmo adaptativo observa se as cartas já estão ordenadas. Se
assim estiverem, ele não mais precisará ordenar. Todavia, isso não ocorre com o algoritmo
não adaptativo.

Termos importantes

• Ordem crescente: diz-se que uma sequência de valores está em ordem crescente se
o elemento sucessivo for maior que o anterior. Por exemplo, 1, 3, 4, 6, 8, 9 estão em
ordem crescente, pois cada elemento seguinte é maior que o elemento anterior;
• Ordem decrescente: diz-se que uma sequência de valores está em ordem decres-
cente se o elemento sucessivo for menor que o atual. Por exemplo, 9, 8, 6, 4, 3, 1 estão
em ordem decrescente, pois cada elemento seguinte é menor que o elemento anterior;
• Ordem não crescente: diz-se que uma sequência de valores está em ordem não
crescente, se o elemento sucessivo for menor ou igual ao seu elemento anterior na
sequência. Essa ordem ocorre quando a sequência contém valores duplicados. Por
exemplo, 9, 8, 6, 3, 3, 1 estão em ordem não crescente;
• Ordem não decrescente: diz-se que uma sequência de valores está em ordem não
decrescente se o elemento sucessivo for maior ou igual ao seu elemento anterior na
sequência. Essa ordem ocorre quando a sequência contém valores duplicados. Por
exemplo, 1, 3, 3, 6, 8, 9 estão em ordem não decrescente.
15m

Bubble Sort – Classificação por Bolha

A classificação por bolhas é um algoritmo de classificação simples.


Esse algoritmo de classificação é um algoritmo baseado em comparação, no qual cada
par de elementos adjacentes é comparado e os elementos são trocados se não estive-
rem em ordem.
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Esse algoritmo não é adequado para grandes conjuntos de dados, pois sua complexi-
dade média e no pior caso é de Ο(n²) em que n é o número de itens.

Note, no exemplo acima: na lista, 14 < 33, mudando o valor comparativo. No segundo
passo, 33 não é menor do que 27, portanto, faz-se a troca. Em seguida, 27 é menor do que
33, repetindo o valor.
O valor de 33 < 35, o que está ordenado. No caos de 35 por 10, é preciso realizar a troca,
mantendo o 35.
Por seu turno, nos quadrados verdes, os valores estão flutuando, começando desordena-
dos e partindo para as suas posições, flutuando.
Implementação do algoritmo:

20m

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Bubble Sort – Desempenho

A classificação de bolha tem uma complexidade média, no pior dos casos, de О(n2 ), em
que n é o número de itens que estão sendo classificados.
Os algoritmos de classificação mais práticos têm uma complexidade média ou pior, subs-
tancialmente melhor, geralmente O(n log n);
Mesmo outros algoritmos de classificação О (n²), como a classificação por inserção geral-
mente são mais rápidos que a classificação por bolhas e não são mais complexos;
Portanto, a classificação por bolhas não é um algoritmo de classificação prático.
A única vantagem significativa que a classificação de bolhas tem sobre a maioria dos
outros algoritmos, mesmo o quick sort, mas não a inserção, é a capacidade de detectar se a
lista é classificada com eficiência é incorporada ao algoritmo.
Quando a lista já está classificada (melhor caso), a complexidade da classificação de
bolhas é apenas O(n).
Por outro lado, a maioria dos outros algoritmos, mesmo aqueles com melhor complexi-
dade de caso médio, executam todo o processo de classificação no conjunto e, portanto, são
mais complexos;
No entanto, a classificação por inserção não apenas compartilha essa vantagem, mas
também apresenta um desempenho melhor.
A classificação de bolhas deve ser evitada no caso de grandes coleções.
Não será eficiente no caso de uma coleção com ordem inversa;

DIRETO DO CONCURSO
1. (CESGRANRIO/TRANSPETRO/ANALISTA DE SISTEMAS JÚNIOR/2011) O algoritmo
Bubble Sort é popular, mesmo que ineficiente. Usando-se esse algoritmo para ordenar
uma tabela, alocada sequencialmente, em ordem crescente contendo os números [5, 4,
1, 3, 2] serão feitas:
a. 10 comparações e 8 trocas
b. 10 comparações e 9 trocas
c. 10 comparações e 10 trocas
d. 16 comparações e 9 trocas
e. 16 comparações e 10 trocas
ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

25m COMENTÁRIO
Abaixo, a cada traço amarelo (com conjunto de números) há uma troca, apresentando o C
como comparação e o T como troca.

2. (COPESE – UFPI/UFPI/ANALISTA DE TECNOLOGIA DA INFORMAÇÃO/2017) A ideia


da ordenação por bolha (Bubble Sort) é percorrer o vetor de elementos sequencial-
mente e, em cada passagem comparar cada elemento com seu sucessor, fazendo-o
chegar ao topo da sequência. Dado que n é o número de elementos do vetor, a comple-
xidade do pior caso desse algoritmo é
a. O(n)
b. O(n²)
c. O(n+1)
d. O(n log n)
e. O(log n)
ANOTAÇÕES

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação I
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMENTÁRIO
Bubble Sort – Desempenho
A classificação de bolha tem uma complexidade média, no pior dos casos, de О(n²), em
que n é o número de itens que estão sendo classificados.
Os algoritmos de classificação mais práticos têm uma complexidade média ou pior, subs-
tancialmente melhor, geralmente O (n log n).
Mesmo outros algoritmos de classificação О (n²), como a classificação por inserção, geral-
mente são mais rápidos que a classificação por bolhas e não são mais complexos. Portan-
to, a classificação por bolhas não é um algoritmo de classificação prático;

GABARITO
1. a
2. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE ORDENAÇÃO II

Nesta aula, continuaremos o assunto de “Algoritmos de Ordenação”. Esse é um assunto


bastante interessante, mas que exige muita atenção do candidato. Se você aprender esse
assunto, você conseguirá tirar “de letra” as questões da prova.

ALGORITMOS DE ORDENAÇÃO

São métodos para organizar coisas. Ex.: métodos para organizar as cartas de um baralho
bagunçado. Cada uma das maneiras de organizar as cartas é um algoritmo diferente.

Ordenação por Inserção ou Insertion Sort

Este é um algoritmo de classificação baseado em comparação “inplace” estável (não


há necessidade de áreas de memória auxiliar, pois o próprio vetor faz as trocas dentro
dele mesmo).
É mantida uma sub-lista que é sempre ordenada. Por exemplo, a parte inferior de um
vetor é mantida para ser classificada.
Um elemento que deve ser “inserido” nesta sub-lista classificada deve encontrar seu local
apropriado e, em seguida, deve ser inserido lá. Daí o nome da ordenação.
O vetor é pesquisado sequencialmente e itens não classificados são movidos e inseridos
na sub-lista classificada (no mesmo vetor);
Esse algoritmo não é adequado para grandes conjuntos de dados, pois sua complexi-
dade média e no pior caso é de Ο(n²), onde n é o número de itens.

Funcionamento

A lista começa desordenada.


ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

5m

Vejamos uma lista completa:


ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Comparação com Bubble Sort


No Bubble Sort, a cada interação, vários elementos alteram de posição. Observe:

Algoritmo
FUNÇÃO INSERTION_SORT (A[], tamanho)
VARIÁVEIS i, j, eleito
PARA i <- 1 ATÉ (tamanho-1) FAÇA
eleito <- A[i];
j <- i-1;
ENQUANTO ((j>=0) E (eleito < A[j])) FAÇA
A[j+1]:= A[j];
j:=j-1;
FIM_ENQUANTO
A[j+1] <- eleito;
FIM_PARA
FIM

Implementação em C

void insertionSort(int arr[], int n){


int i, key, j;
for (i = 1; i < n; i++) {
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
Ordenação por Inserção

À medida que a sub-lista ordenada anda em direção à direita, ela captura cada elemento
e o coloca na posição correta da lista. Esse é o principal conceito que você deve entender.
10m

Ordenação por Seleção


A ordenação por seleção é um algoritmo de classificação não estável simples. Esse algo-
ritmo de ordenação é um algoritmo baseado em comparação “in-place”, em qual a lista é divi-
dida em duas partes, a parte classificada na extremidade esquerda e a parte não classificada
na extremidade direita.
Inicialmente, a parte classificada está vazia e a parte não classificada é a lista inteira.
O menor elemento é selecionado da matriz não classificada e trocado pelo elemento mais
à esquerda, e esse elemento se torna parte da matriz classificada. Esse processo continua
movendo o limite da matriz não classificada por um elemento para a direita.
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Esse algoritmo não é adequado para grandes conjuntos de dados, pois suas complexida-
des média e pior dos casos é de Ο(n²), onde n é o número de itens;

Funcionamento

O menor elemento da sub-lista à direita foi selecionado e colocado na posição.

Perceba que essa lista cresce em direção à direita, até tomar conta de todo o vetor, no
entanto, sem modificação. Ou seja, ela aumenta da esquerda para a direita, selecionando o
menor elemento que esteja à direita.
A Insertion Sort pegava o próximo elemento e o inseria na posição correta. O Selection
Sort seleciona o menor elemento na sub-lista desordenada e o coloca como o maior ele-
mento da sub-lista ordenada.
ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Implementação em C

void selection_sort(int num[], int tam) {


int i, j, min, aux;
for (i = 0; i < (tam-1); i++) {
min = i;
for (j = (i+1); j < tam; j++) {
if(num[j] < num[min])
min = j;
}
if (num[i]!= num[min]) {
aux = num[i];
num[i] = num[min];
num[min] = aux;
}
}
15m

Ordenação por Seleção ou Selection Sort


ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

DIRETO DO CONCURSO
1. CESGRANRIO/PETROBRAS/ANALISTA DE SISTEMAS JÚNIOR/PROCESSOS DE
NEGÓCIO/2018) Um programador construiu uma função para ordenar vetores de intei-
ros por meio do algoritmo de ordenação por inserção (insertion sort). A versão iterativa
desse algoritmo possui dois loops aninhados. Suponha que esse programador tenha
inserido, imediatamente antes do incremento da variável de controle do loop mais exter-
no, uma chamada de uma função para percorrer e exibir o conteúdo do vetor que está
sendo ordenado. O trecho de código a seguir ilustra como essa chamada é feita.
for (int i = 1; i < vetor.length; i++){
/* Os demais comandos que implementam o algoritmo de ordenação por inserção de-
vem substituir essas linhas com comentários
*/
exibeVetor(vetor);
}
A Figura abaixo exibe o vetor que foi passado como parâmetro em uma chamada da
função de ordenação.

78 12 35 1 17 4 43 11 17 1

O que será exibido no console quando o valor da variável i for igual a 3?


a. 1 1 11 12 17 4 17 35 43 78
b. 1 12 4 17 11 17 1 35 43 78
c. 1 1 4 78 17 35 43 11 17 12
d. 1 12 35 78 17 4 43 11 17 1
e. 1 1 4 11 17 35 43 78 17 12

COMENTÁRIO
i=0 78 12 35 1 17 4 43 11 17 1
i=1 12 78 35 1 17 4 43 11 17 1
i=2 12 35 78 1 17 4 43 11 17 1
ANOTAÇÕES

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

i=3 1 12 35 78 17 4 43 11 17 1
20m

2. (CS-UFG/UFG/TÉCNICO DE TECNOLOGIA DA INFORMAÇÃO/2019) Seja o vetor A


com n elementos (n>5), cujo primeiro elemento está na posição 1 e o último está na posi-
ção n. O algoritmo a seguir, que está escrito em pseudocódigo, busca ordenar o vetor A:
para i = 1 até n–1, faça
min = i
para j = i+1 até n, faça
se A[j] < A[min], então
min = j
fim-se
fim-para
temp = A[i]
A[i] = A[min]
A[min] = temp
fim-para
Essencialmente, o pseudocódigo refere-se ao algoritmo:
a. ordenação por seleção.
b. ordenação por inserção.
c. ordenação por bolha.
d. Quicksort.

COMENTÁRIO
Implementação em C
void selection_sort(int num[], int tam) {
int i, j, min, aux;
for (i = 0; i < (tam-1); i++) {
min = i;
for (j = (i+1); j < tam; j++) {
if(num[j] < num[min])
min = j;
}
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação II
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

if (num[i]!= num[min]) {
aux = num[i];
num[i] = num[min];
num[min] = aux;
}
}
}

3. (CESGRANRIO/PETROBRAS/ANALISTA DE SISTEMAS JÚNIOR/PROCESSOS DE


NEGÓCIO/2018) Dada a sequência numérica (15,11,16,18,23,5,10,22,21,12) para or-
denar pelo algoritmo Selection Sort, qual é a sequência parcialmente ordenada depois
de completada a quinta passagem do algoritmo?
a. [15, 11, 16, 18, 12, 5, 10, 21, 22, 23]
b. [15, 11, 5, 10, 12, 16, 18, 21, 22, 23]
c. [15, 11, 16, 10, 12, 5, 18, 21, 22, 23]
d. [10, 11, 5, 12, 15, 16, 18, 21, 22, 23]
e. [12, 11, 5, 10, 15, 16, 18, 21, 22, 23]

COMENTÁRIO
Por alguma razão desconhecida, a banca começou a fazer a ordenação da direita para
esquerda (do fim para o começo), o que não é muito comum nesse algoritmo.
P0 (15,11,16,18,23,5,10,22,21,12)
P1 (15,11,16,18,12,5,10,22,21,23)
P2 (15,11,16,18,12,5,10,21,22,23)
P3 (15,11,16,18,12,5,10,21,22,23)
P4 (15,11,16,10,12,5,18,21,22,23)
P5 (15,11,5,10,12,16,18,21,22,23)

GABARITO
1. d
2. a
3. b
�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Lage Payne de Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.

www.grancursosonline.com.br 9
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE ORDENAÇÃO III

Vamos dar continuidade ao assunto “Algoritmos de Ordenação”, que é bastante interes-


sante e relativamente bem cobrado nas provas, com questões de nível médio de dificuldade.
Nas primeiras aulas, vimos algoritmos de ordenação mais simples, porém pouco eficien-
tes, como Bubble Sort, Insertion Sort e Selection Sort.
A partir desta aula, começaremos a falar sobre algoritmos mais eficientes e rápido e, con-
sequentemente, um pouco mais complicados de serem implementados.

Ordenação por Intercalação / Merge Sort


A ordenação por intercalação é uma técnica de classificação baseada na técnica de divi-
dir e conquistar. A pior complexidade do tempo é (n log n), que é melhor do que os algoritmos
de inserção, de seleção e de bolha.
Primeiro divide-se o vetor em metades iguais e depois as combina de maneira ordenada.
Como o algoritmo usa a recursividade, há um alto consumo de memória e tempo de execu-
ção, tornando esta técnica não muito eficiente em alguns problemas.
Apesar de possuir uma boa performance, por ter que utilizar recursividade, ela acaba
gastando muita memória (monta uma pilha de chamadas muito alta).

Funcionamento
A lista é dividida no meio. Em seguida, cada uma das sub-listas é dividida no meio, até
chegar aos elementos.

Em seguida, as sub-listas são unidas e intercaladas de forma ordenada.

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Cada uma das listas que representa os elementos atômicos é uma lista ordenada.
5m
Imagine que há duas listas de números ou duas pilhas de cartas ordenadas (viradas para
cima). Como gerar uma pilha única das duas ordenadas? Por meio da intercalação: você
deve pegar as duas pilhas de maneira ordenada. Nesse caso, a terceira pilha também estará
ordenada. Para que isso dê certo, as duas pilhas devem estar ordenadas.

Algoritmo
01. mergesort(A[0...n - 1], inicio, fim)
02. | se(inicio < fim)
03. | | meio ← (inicio + fim) / 2 //calcula o meio
04. | | mergesort(A, inicio, meio) //ordena o subvetor esquerdo 05. | | mergesort(A, meio +
1, fim) //ordena o subvetor direito
06. | | merge(A, inicio, meio, fim) //funde os subvetores esquerdo e direito
07. | fim_se
08. fim_mergesort
Além disso, observe:
01. merge(A[0...n - 1], inicio, meio, fim)
02. | tamEsq ← meio - inicio + 1 //tamanho do subvetor esquerdo
03. | tamDir ← fim - meio //tamanho do subvetor direito 04. | inicializar vetor Esq[0...
tamEsq - 1] 05. | inicializar vetor Dir[0...tamDir - 1]
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

06. | para i ← 0 até tamEsq – 1


07. | | Esq[i] ← A[inicio + i] //elementos do subvetor esquerdo
08. | fim_para
09. | para j ← 0 até tamDir – 1
10. | | Dir[j] ← A[meio + 1 + j] //elementos do subvetor direito
11. | fim_para
12. | idxEsq ← 0 //índice do subvetor auxiliar esquerdo
13. | idxDir ← 0 //índice do subvetor auxiliar direito
14. | para k ← inicio até fim
15. | | se(idxEsq < tamEsq)
16. | | | se(idxDir < tamDir)
17. | | | | se(Esq[idxEsq] < Dir[idxDir])
18. | | | | | A[k] ← Esq[idxEsq]
19. | | | | | idxEsq ← idxEsq + 1
20. | | | | senão
21. | | | | | A[k] ← Dir[idxDir] 22. | | | | | idxDir ← idxDir + 1
23. | | | | fim_se
24. | | | senão
25. | | | | A[k] ← Esq[idxEsq]
26. | | | | idxEsq ← idxEsq + 1
27. | | | fim_se
28. | | senão
29. | | | A[k] ← Dir[idxDir]
30. | | | idxDir ← idxDir + 1
31. | | fim_se
32. | fim_para
33. fim_merge
10m
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Implementação em C

void mergeSort(int vetor[], int comeco, int fim){


if (comeco < fim) {
int meio = (fim+comeco)/2;
mergeSort(vetor, comeco, meio);
mergeSort(vetor, meio+1, fim);
merge(vetor, comeco, meio, fim);
}
Ademais, perceba o seguinte:
void merge(int vetor[], int comeco, int meio, int fim) {
int com1 = comeco, com2 = meio+1, comAux = 0, tam = fim-comeco+1;
int *vetAux;
vetAux = (int*)malloc(tam * sizeof(int));

while(com1 <= meio && com2 <= fim){


if(vetor[com1] < vetor[com2]) {
vetAux[comAux] = vetor[com1];
com1++;
} else {
vetAux[comAux] = vetor[com2];
com2++;
}
comAux++;
}

while(com1 <= meio){ //Caso ainda haja elementos na primeira metade


vetAux[comAux] = vetor[com1];
comAux++;
com1++;
}
while(com2 <= fim) { //Caso ainda haja elementos na segunda metade
vetAux[comAux] = vetor[com2];
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

comAux++;
com2++;
}
// Move os elementos de volta para o vetor original
for(comAux = comeco; comAux <= fim; comAux++){
vetor[comAux] = vetAux[comAux-comeco];
}
free(vetAux);
}
Essa ordenação não é considera in-place, isto é, para conseguir fazer a ordenação, é
preciso mais memória.
O Merge Sort é mais performático, porém gasta mais memória. Além disso, a recursivi-
dade também causa grande consumo de memória.

Ordenação por Intercalação / Merge Sort

Ordenação Shell
É um algoritmo de classificação altamente eficiente e baseia-se no algoritmo de classi-
ficação de inserção. Esse algoritmo evita grandes mudanças, como no caso da inserção,
se o valor menor estiver na extrema direita e precisar ser movido para a extrema esquerda.
Ocorre que ele usa a ordenação por inserção em elementos amplamente espaçados, pri-
meiro para classificá-los e depois classifica os elementos menos espaçados. Ademais, ele é
bastante eficiente para conjuntos de dados de tamanho médio, pois sua complexidade média
e o pior dos casos depende da sequência de intervalos:
ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O(N1.2) para a sequência 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023;
O(N(log2N)²) para a sequência 1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81.
15m

Essa ordenação não tem um custo O(N) bem definido. No caso da Shell Sort, o seu custo
não é bem definido, o qual depende da característica da lista. O custo pode ser muito alto
ou muito baixo. Nesse contexto, essa ordenação pode não ser muito interessante em alguns
casos, pois, se seu custo varia tanto, não se sabe quanto tempo ela durará exatamente.

VANTAGENS E DESVANTAGENS

Vantagens:
• Shell sort é uma ótima opção para arquivos de tamanho moderado;
• Sua implementação é simples e requer uma quantidade de código pequena.

Desvantagens:
• O tempo de execução do algoritmo é sensível à ordem inicial do arquivo;
• O método não é estável.

Funcionamento
Intervalo de 4

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Intervalo de 1

Classificação por inserção

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Implementação em C

void shellSort(int array[], int n){


for (int gap = n/2; gap > 0; gap /= 2){
for (int i = gap; i < n; i += 1) {
int temp = array[i];
int j;
for (j = i; j >= gap && array[j - gap] > temp; j -= gap){
array[j] = array[j - gap];
}
array[j] = temp;
}

DIRETO DO CONCURSO
1 (CCV-UFC/UFC/TÉCNICO DE TECNOLOGIA DA INFORMAÇÃO/2019) Para realizar a
ordenação de um vetor de inteiros contendo n números, foi utilizado um algoritmo de ordena-
ção baseado na estratégia de dividir para conquistar e na divisão e ordenação recursiva das
partes do vetor, obtendo um tempo de execução O(n log n). Qual das opções abaixo contém
20m
o algoritmo de ordenação descrito?

a) Shell Sort
b) Quick Sort
c) Merge Sort
d) Bucket Sort
e) Insertion Sort

COMENTÁRIO
Existem vários métodos que são do tipo “dividir para conquistar”, no entanto, o mais emble-
mático é o algoritmo de Merge Sort.
• A ordenação por intercalação é uma técnica de classificação baseada na técnica de
dividir e conquistar;
ANOTAÇÕES

www.grancursosonline.com.br 8
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação III
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

• A pior complexidade do tempo é (n log n);


• Primeiro divide-se o vetor em metades iguais e depois as combina de maneira ordenada;
• Como o algoritmo usa a recursividade, há um alto consumo de memória e tempo de
execução, tornando esta técnica não muito eficiente em alguns problemas.

2. (CESGRANRIO/BACEN/ANALISTA DO BANCO CENTRAL/ÁREA 1/2010) Uma fábrica


de software foi contratada para desenvolver um produto de análise de riscos. Em determi-
nada funcionalidade desse software, é necessário realizar a ordenação de um conjunto for-
mado por muitos números inteiros. Que algoritmo de ordenação oferece melhor complexi-
dade de tempo (Big O notation) no pior caso?

a) Merge sort
b) Insertion sort
c) Bubble sort
d) Quick sort
e) Selection sort

COMENTÁRIO
O insertion sort, o bubble sort e o selection sort são bem parecidos; eles possuem custos
muito parecidos: O(N²)
Uma característica do Merge Sort é a seguinte:
• A pior complexidade do tempo sendo (n log n).

GABARITO
1. c
2. a

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 9
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

ALGORITMOS DE ORDENAÇÃO IV

QUICKSORT

É um algoritmo de ordenação altamente eficiente e baseia-se no particionamento do


vetor de dados em vetores menores.
Um vetor grande é particionada em dois, um dos quais mantém valores menores que
o valor especificado, chamado de pivô, com base no qual a partição é feita e outro vetor
mantém valores maiores que o valor do pivô.
O Quicksort particiona um vetor e depois se chama recursivamente duas vezes para clas-
sificar os dois sub-vetores resultantes;
Esse algoritmo é bastante eficiente para conjuntos de dados de grande porte, pois
sua complexidade média é O (n Log n) e no pior caso O(n2).
O algoritmo determina um elemento para ser o pivô e vai trocando esses elementos até a
metade da lista, fazendo as comparações e inserindo o pivô em seu lugar certo.
5m
O pior caso possível é que o algoritmo escolha um pivô que esteja desbalanceado, isto
é, muito a direita da lista.

Algoritmo

Obs.: percebe-se que ocorre chamada recursiva. Há, ainda, custo de memória adicional.
ANOTAÇÕES

www.grancursosonline.com.br 1
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Implementação em C

Obs.: o Quicksort é um algoritmo rápido e muito eficiente, sendo utilizado em casos reais.

HEAPSORT

É um algoritmo de ordenação baseado em comparação de dados de um Heap Binário.


É semelhante a ordenação por seleção, onde primeiro encontramos o elemento máximo
e colocamos o elemento máximo no final. Repetimos o mesmo processo para o ele-
mento restante.
ANOTAÇÕES

www.grancursosonline.com.br 2
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Heap Binário
10m
Inicialmente, é necessário definir uma árvore binária completa. Uma árvore binária com-
pleta é uma árvore binária na qual todos os níveis, exceto possivelmente o último, são com-
pletamente preenchidos e todos os nós ficam o mais à esquerda possível.
Um Heap Binário é uma Árvore Binária Completa, na qual os itens são armazenados em
uma ordem especial, de forma que o valor em um nó pai seja maior (ou menor) que os valo-
res em seus dois nós filhos.
O primeiro é chamado como heap máximo e o último é chamado heap mínimo. O heap
pode ser representado por árvore ou vetor binário. Como uma pilha binária é uma árvore
binária completa, ela pode ser facilmente representada, pois o vetor e a representação base-
ada em vetores são eficientes em termos de espaço.
Se o nó pai estiver armazenado no índice I, o filho esquerdo poderá ser calculado em 2 *
I + 1 e o filho direito em 2 * I + 2 (assumindo que a indexação comece em 0).

COMPLEXIDADE

Complexidade O(n log n) no pior e médio caso. Mesmo tendo a mesma complexidade no
caso médio que o QuickSort, o HeapSort acaba sendo mais lento que algumas boas imple-
mentações do QuickSort. Porém, além de ser mais rápido no pior caso que o QuickSort,
necessita de menos memória para executar.
QuickSort necessita de um vetor O(log n) para guardar as estruturas enquanto o Heap-
Sort não necessita de um vetor auxiliar.
ANOTAÇÕES

www.grancursosonline.com.br 3
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Em situações em que há uma restrição muito séria de memória, talvez o HeapSort


seja o ideal.

Algoritmo
• Dado um vetor V de n elementos, transformar o vetor em um heap;
• Pegar a posição V[1] (ou seja, o maior elemento) e trocar de posição com V[max];
• Repetir o processo com um array formado pelos elementos V[1],..., V[n-1].

Implementação em C

15m

DIRETO DO CONCURSO
1. (2011/CESGRANRIO/PETROBRAS/ANALISTA DE SISTEMAS JÚNIOR – ENGENHA-
RIA DE SOFTWARE) A ordenação é um problema muito importante para os desen-
volvedores de software. Para implementá-la, existem vários algoritmos que já foram
amplamente estudados, como o BubbleSort, o QuickSort e o MergeSort. Uma das ca-
racterísticas estudadas desses algoritmos é o tempo de execução, que, usualmente, é
medido através da notação O (Big-Oh). Sobre esses conceitos, considere as afirmati-
vas abaixo.
ANOTAÇÕES

www.grancursosonline.com.br 4
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

I – O tempo de pior caso do algoritmo QuickSort é de ordem menor que o tempo médio
do algoritmo Bubblesort.
II – O tempo médio do QuickSort é O(n log2n), pois ele usa como estrutura básica uma
árvore de prioridades.
III – O tempo médio do QuickSort é de ordem igual ao tempo médio do MergeSort.

Está correto APENAS o que se afirma em


a. I
b. II
c. III
d. I e III
e. II e III

COMENTÁRIO
Para responder essa questão é importante observar a seguinte tabela comparativa:


ANOTAÇÕES

www.grancursosonline.com.br 5
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

I – não é de ordem menor do que o tempo médio do algoritmo Bubblesort.


II – o tempo médio é O(n log n).
III – o tempo médio de ambos é O(n log n).

2. (2018/FCM/IFN-MG/PROFESSOR – INFORMÁTICA) Na tabela a seguir, considerando


os métodos de ordenação, que visam a colocar uma lista em ordem para facilitar a bus-
ca de informações nela contidas, associe os métodos à sua respectiva descrição.
Método de Ordenação

(1) Bubble Sort


(2) Insert Sort
(3) Select Sort
(4) Shellsort
(5) Mergesort
(6) Quicksort
(7) Heapsort
20m

I – ( ) Neste método, a lista é subdividida em h-listas, as quais são ordenadas com um


método de ordenação qualquer. Esse procedimento é repetido para valores decres-
centes de h, sendo que o último valor de h tem que ser 1.
ANOTAÇÕES

www.grancursosonline.com.br 6
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

II – ( ) Neste método, são usados, inicialmente, os elementos da lista que são inseridos
em um heap binário crescente. Em seguida, são feitas sucessivas remoções do menor
elemento do heap, colocando os elementos removidos do heap de volta na lista.
III – ( ) Neste método, a lista é dividida em duas metades. Essas metades são ordenadas
recursivamente e depois são intercaladas. Para tanto, faz-se uso das variáveis i e j
para percorrer a metade esquerda e a metade direita, respectivamente. Em cada ite-
ração, compara-se o elemento na posição i com o elemento na posição j. O menor
deles é copiado para um vetor auxiliar. Esse procedimento é repetido até que uma
das duas metades tenha sido totalmente copiada para o vetor auxiliar.
IV – ( ) Neste método, os elementos da lista são movidos para as posições adequadas
de forma contínua. Se um elemento está inicialmente numa posição i e, para que a
lista fique ordenada, ele deve ocupar a posição j, então ele terá que passar por todas
as posições entre i e j. Em cada iteração do método, percorre-se a lista a partir de
seu início, comparando cada elemento com seu sucessor, trocando-os de posição se
houver necessidade.
V – ( ) Neste método, a lista é dividida em parte esquerda e parte direita, sendo que
os elementos da parte esquerda são todos menores do que os elementos da parte
direita. Em seguida, as duas partes são ordenadas recursivamente.
VI – ( ) Neste método, considera-se que a lista está dividida em parte esquerda, já orde-
nada, e parte direita, em possível desordem. Além disso, os elementos da parte
esquerda são todos menores ou iguais aos elementos da parte direita. Cada iteração
consiste em escolher o menor elemento da parte direita (pivô) e trocá-lo com o pri-
meiro elemento da parte direita. Com isso, a parte esquerda aumenta, pois passa a
incluir o pivô, e a parte direita diminui.
VII – ( ) Neste método, considera-se que a lista está dividida em parte esquerda, já orde-
nada, e parte direita, em possível desordem. Inicialmente, a parte esquerda contém
apenas o primeiro elemento da lista. Cada iteração consiste em colocar o primeiro
elemento da parte direita (pivô) na posição adequada da parte esquerda, de modo
que a parte esquerda continue ordenada.

A sequência correta desta associação é


ANOTAÇÕES

www.grancursosonline.com.br 7
TECNOLOGIA DA INFORMAÇÃO
Algoritmos de Ordenação IV
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

a. (2); (5); (4); (6); (7); (1); (3).


b. (4); (7); (5); (1); (6); (3); (2).
c. (6); (2); (3); (5); (1); (7); (4).
d. (3); (6); (7); (4); (5); (2); (1).
e. (7); (4); (1); (2); (3); (5); (6).

COMENTÁRIO
I – Shellsort.
II – Heapsort.
III – Mergesort.
IV – Bubblesort.
V – Quicksort.
VI – Selectsort.
VII – Insertsort.

GABARITO
1. c
2. b

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula
preparada e ministrada pelo professor Tiago Pádua.
A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo
ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclu-
siva deste material.
ANOTAÇÕES

www.grancursosonline.com.br 8

Você também pode gostar