Escolar Documentos
Profissional Documentos
Cultura Documentos
ESTRUTURA DE DADOS
UNIDADE 2 – ORDENAÇÃ O DE DADOS
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 1/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 2/43
28/02/2023, 19:11 Estrutura de Dados
Introdução
A estrutura de dados se trata de um método utilizado para organizar os dados de forma adequada, para o
computador processá-los de maneira eficiente, além de também definirem os métodos de acesso e o modo
como serão manipulados. No entanto, como organizamos os dados?
Nas aplicaçõ es, encontramos problemas que, muitas vezes, requerem ordenação para facilitar o acesso e o
tempo, como colocar os nú meros em ordem crescente ou decrescente e os nomes em ordem alfabética.
Assim, para organizar os elementos de forma eficiente, utilizamos métodos, como os algoritmos de
ordenação. Atualmente, existem diversos algoritmos de ordenação, por isso, o conceito deles e sua aplicação
são essenciais para o desenvolvimento de sistemas. Dessa forma, podemos escolher o melhor método, de
acordo com a necessidade, melhorando o desempenho das aplicaçõ es.
Nesse contexto, como decidimos qual método de ordenação aplicar? Como entendemos a complexidade de um
algoritmo e como devemos analisá-la?
A escolha da estrutura adequada para cada sistema depende diretamente do conhecimento dos algoritmos e do
que o sistema necessita. Para escolher um método de ordenação que seja eficiente, temos que entender a
complexidade dos algoritmos, analisando o desempenho do que está sendo desenvolvido. A complexidade é
utilizada para entender e avaliar se um algoritmo é eficiente, considerando o espaço de memó ria utilizado e o
tempo para resolver os problemas. Assim, analisa-se o algoritmo com hipó teses comuns e inusitadas, a fim
de descobrir qual será o desempenho nos melhores e piores casos.
Ao longo desta unidade, vamos nos aprofundar nesses pontos de estudos. Acompanhe!
2.1 Algoritmos
Algoritmos de ordenação são exemplos de algoritmos criados para resolverem problemas de forma mais
rápida, com o auxílio de um computador. Existem várias técnicas que podem ser utilizadas, sendo que cada
uma tem procedimentos distintos para resolver a mesma tarefa. Algumas são mais adequadas para serem
usadas com uma base de dados pequena, enquanto outras para uma base de dados maior, assim como umas
são mais simples que outras. O fato é que todas ilustram regras básicas para a manipulação de estruturas de
dados.
De acordo com Ziviani (2012, p. 111), ordenar “[…] corresponde ao processo de rearranjar um conjunto de
objetos em ordem ascendente ou descendente. O objetivo principal da ordenação é facilitar a recuperação
posterior de itens do conjunto ordenado”.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 3/43
28/02/2023, 19:11 Estrutura de Dados
VOCÊ SABIA?
Existe uma ONG educacional chamada Khan Academy, criada em 2008, com a
missã o de oferecer conteú do sobre diversas maté rias. Entre elas, há alguns
mé todos de ordenaçã o e a descriçã o da notaçã o de complexidade de algoritmos.
Para saber mais sobre ela, podemos acessar o site por meio do link:
https://pt.khanacademy.org/computing/computer-science/algorithms#quick-
sort. (https://pt.khanacademy.org/computing/computer-
science/algorithms#quick-sort.)
Para ordenar os dados, utilizamos métodos de ordenação, que podem ser classificados em ordenação interna
e ordenação externa. Clique nas abas para conhecer.
•
Ordenação interna
Na ordenaçã o interna, os elementos a serem
ordenados cabem na memó ria principal, sendo
que qualquer registro pode ser imediatamente
acessado.
Ordenação externa
Na ordenaçã o externa, os elementos a serem
ordenados nã o cabem na memó ria principal e os
registros sã o acessados sequencialmente ou em
grandes blocos.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 4/43
28/02/2023, 19:11 Estrutura de Dados
CASO
Imagine que temos uma agenda telefônica e desejamos buscar algum contato
(pode ser uma agenda on-line ou uma lista telefônica). É claro que a nossa busca
se tornaria mais rá pida se os nomes presentes na agenda estivessem em ordem
alfabé tica, nã o é ? Nessa perspectiva, uma lista telefônica possui pelo menos dois
atributos fundamentais, como nome e nú mero do telefone. Agora, pense, por
exemplo, que temos uma agenda telefônica com os contatos de 100 pessoas, mas
precisamos buscar o nú mero do Joã o. Se a agenda estiver ordenada pelo nome
em ordem alfabé tica, a busca será mais fá cil, certo?
E se essa agenda estiver organizada em ordem crescente pelos nú meros de
telefone, será que conseguiríamos achar o nú mero do Joã o de forma rá pida?
Sabemos que a resposta é “nã o”, pois, se estamos procurando o nú mero do Joã o,
quer dizer que nã o sabemos qual é , por isso, uma lista com os nú meros em
ordem crescente nã o nos ajudaria.
O exemplo da agenda telefônica é trivial, poré m é importante ressaltar que,
quando desejamos fazer uma ordenaçã o com os dados, precisamos analisar quais
dados realmente necessitam ser ordenados ou qual o atributo que irá auxiliar
para que possamos recuperar as informações de forma mais rá pida, ou seja, mais
eficiente.
Assim, a partir de agora, vamos aprender os conceitos dos principais métodos de ordenação e um pouco
sobre a complexidade de cada algoritmo.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 5/43
28/02/2023, 19:11 Estrutura de Dados
Temos, então, que a complexidade de um algoritmo pode ser calculada por meio da complexidade temporal e
da espacial. Na primeira, analisamos o tempo que as instruçõ es levam para serem executadas (a partir das
funçõ es) e, na sequência, o espaço na memó ria que o algoritmo usa. O esforço realizado pelo algoritmo
também deve ser observado, calculado a partir da quantidade de vezes que a operação fundamental (método
de comparação) é executada.
Szwarcfiter e Markenzon (2010) destacam que a complexidade de tempo pode ser descrita com o esquema:
seja A um algoritmo e { } o conjunto de todas as entradas possíveis de A, devemos denotar por
o nú mero de passos efetuados por A, quando a entrada for . Define-se, então, que:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 6/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um array de 5 posiçõ es. Na primeira posição está armazenado o valor 5, na
segunda posição está armazenado o velor 3, na terceira posição está armazenado o valor 8, na quarta posição
está armazenado o valor 2 e na ú ltima posição está armazenado o valor 6.
Considere o exemplo anterior como array = {5, 3, 8, 2, 6}.
Primeiramente, são analisados os dois elementos iniciais do array, que seriam o array [0] e o array [1].
Depois de analisar e ver qual dos elementos é o maior, o algoritmo vai trocar os elementos caso o segundo
seja menor que o primeiro. Temos, então array = {3, 5, 8, 2, 6}. Assim, o algoritmo alterou os nú meros 5 e 3,
colocando o 3 no array [0] e o 5 no array [1].
Na pró xima interação, o algoritmo irá comparar o elemento do array [1] com o array [2] e verificar qual deles
é menor. No caso, o 5 é menor que o 8, então, o algoritmo não altera nada, ficando em array = {3, 5, 8, 2, 6}.
Depois, o algoritmo vai analisar o array [2] com o array [3]. Como o nú mero 8 é maior que o 2, haverá a troca
dos elementos reordenando o array em array = {3, 5, 2, 8, 6}. A interação na sequência irá analisar o array [3]
e o array [4]. Como 8 é maior que 6, também haverá a troca dos elementos, reordenando novamente o array
em array = {3, 5, 2, 6, 8}.
Assim, foi realizada a primeira interação por completo pelo algoritmo. Com ela, podemos verificar que o
maior nú mero ficou na ú ltima posição do array. Essas interaçõ es serão repetidas até que todo o array seja
ordenado.
A seguir, vamos demonstrar a ordenação utilizando apenas o exemplo, mostrando quando há e quando não há
a alteração dos elementos. Na tabela, temos as operaçõ es e, caso seja verdade, vamos realizar a troca dos
elementos e reordenar o vetor. Em caso falso, não vamos fazer nada no array. Vejamos!
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 7/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra uma tabela de 4 colunas e 12 linhas. O título das colunas são,
respectivamente: Array, Comparação, Verdade(troca), Falso(mantém). Em cada linha temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 8/43
28/02/2023, 19:11 Estrutura de Dados
VAMOS PRATICAR?
Dado o array = [9, 5, 1, 3, 4, 7, 2], ordene os nú meros em ordem crescent
Bubble-Sort e, depois, descreva quantas comparações e trocas foram realiza
Agora que já sabemos como o nosso método de ordenação funciona, veja na figura a seguir o pseudocó digo do
algoritmo.
PraCegoVer: A imagem mostra um trecho de có digo de 9 linhas de programa. Enumerando cada linha temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 9/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um trecho de có digo de 36 linhas de programa. Enumerando cada linha
temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 10/43
28/02/2023, 19:11 Estrutura de Dados
LInha 13: }
Linha 14: }
Linha 15: System.out.print(" ");
Linha 16:
Linha 17: for(i = 0; i < 5; i++){
Linha 18: for(int j = 0; j < 4; j++){
Linha 19: if(array[j] > array[j + 1]){
Linha 20: aux = array[j];
Linha 21: array[j] = array[j+1];
Linha 22: array[j+1] = aux;
Linha 23: }
Linha 24: }
Linha 25: }
Linha 26: System.out.println(" ");
Linha 27: System.out.print("Array Ordenado = { ");
Linha 28: for(i = 0; i < 5; i++){
Linha 29: if(i==4){
Linha 30: System.out.print(array[I] + " }");
Linha 31: }else{
Linha 32: System.out.print(array[i] + ", ");
Linha 33: }
Linha 34: }
Linha 35: }
Linha 36: }
Ao lado direito da figura tem um retângulo preto com duas linhas simulando a execução do programa.
Enumerando cada linhas temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 11/43
28/02/2023, 19:11 Estrutura de Dados
Muitos autores, como o Ziviani (2012), utilizam uma analogia para escrever o algoritmo: é o modo como
algumas pessoas ordenam as cartas em um jogo de baralho. Imagine que você esteja jogando cartas e as cartas
que estão na sua mão estão ordenadas. Você recebe uma nova carta e esta deve ser ordenada também, ou seja,
é preciso colocá-la na posição correta. A carta pode ser maior ou menor que outras que você já possui, por
isso, você começa a comparar sua nova carta com as cartas que estão na sua mão, até encontrar a posição
correta. Encontrando-a, terá novamente uma mão com cartas ordenadas.
Vejamos como funciona a ordenação crescente de um array unidimensional com o algoritmo de ordenação
Insertion-Sort a seguir.
PraCegoVer: A imagem mostra um array de 5 posiçõ es. Na primeira posição está armazenado o valor 5, na
segunda posição está armazenado o velor 3, na terceira posição está armazenado o valor 8, na quarta posição
está armazenado o valor 2 e na ú ltima posição está armazenado o valor 6.
Considere o exemplo anterior como array = {5, 3, 8, 2, 6}.
Primeiramente, analisamos os dois elementos iniciais do array, ou seja, array [0] e array [1]. Depois de
analisar e ver qual dos elementos é o maior, o algoritmo vai trocar os elementos, caso o segundo seja menor
que o primeiro. Temos, então, array = {3, 5, 8, 2, 6}. Assim, o algoritmo alterou os nú meros 5 e 3, colocando o
3 no array [0] e o 5 no array [1].
Na pró xima interação, o algoritmo irá comparar o elemento do array [1] com o array [2], a fim de verificar
qual deles é menor. No caso, o 5 é menor que o 8, então, o algoritmo não altera nada, ficando com array = {3,
5, 8, 2, 6}.
Depois, o algoritmo vai analisar o array [2] com o array [3]. Como o nú mero 8 é maior que o 2, haverá a troca
dos elementos, reordenando o array. Assim, array = {3, 5, 2, 8, 6}.
A interação a seguir, diferente do que ocorre no Bubble-Sort, irá continuar analisando o nú mero 2 até encontrar
seu lugar final. Dessa forma, irá comparar o array [2] = 2 com o array [1] = 5. Como 5 é maior que 2, haverá a
troca novamente, ficando com array = {3, 2, 5, 8, 6}.
A pró xima interação também continuará analisando o nú mero 2, então, irá comparar o array [1] = 2 com o
array [0] = 3. Como 3 é maior que 2, haverá a troca novamente, em que teremos array = {2, 3, 5, 8, 6}.
Assim, foi realizada a primeira interação pelo algoritmo, em que podemos verificar que ele foi comparando os
arrays da esquerda para a direita, até encontrar o local final do menor nú mero, que, no caso, foi o 2. A
interação ainda será repetida mesmo que o conjunto esteja ordenado, pois o algoritmo ainda não percorreu o
array inteiro e não sabe que ele já está ordenado.
Na tabela a seguir, temos o passo a passo desde o início de como é realizada a ordenação utilizando o
Insertion-Sort.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 12/43
28/02/2023, 19:11 Estrutura de Dados
PraCegoVer: A imagem mostra uma tabela de 4 colunas e 7 linhas. O título das colunas são, respectivamente:
Array, Comparação, Verdade, Falso. Em cada linha temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 13/43
28/02/2023, 19:11 Estrutura de Dados
VAMOS PRATICAR?
Dado o array = [9, 5, 1, 3, 4, 7, 2], ordene os nú meros em ordem crescent
Insertion-Sort e descreva quantas comparações e trocas foram realizadas.
Agora que já sabemos como o método de ordenação funciona, vamos apresentar o pseudocó digo do algoritmo
Insertion-Sort:
PraCegoVer: A imagem mostra um trecho de có digo de 10 linhas de programa. Enumerando cada linha temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 14/43
28/02/2023, 19:11 Estrutura de Dados
Linha 8: }
Linha 9: array [j+1] = aux;
Linha 10: }
A seguir, temos uma das possíveis formas de desenvolver o algoritmo de ordenação do Insertion-Sort, com a
implementação do có digo na linguagem Java. A parte em preto se trata da impressão do console.
PraCegoVer: A imagem mostra um trecho de có digo de 38 linhas de programa. Enumerando cada linha temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 15/43
28/02/2023, 19:11 Estrutura de Dados
Linha 6: int j = 0;
Linha 7:
Linha 8: System.out.print("Array Desordenado = { ");
Linha 9: for (i = 0; i < 5; i++){
Linha 10: if (i==4){
Linha 11: System.out.print(array [i] + " }");
Linha 12: }else{
Linha 13: System.out.print(array [i] + ", ");
Linha 14: }
Linha 15: }
Linha 16: System.out.printn(" ");
Linha 17:
Linha 18: for (i = 1; i < 5; i++) {
Linha 19: aux = array[i];
Linha 20: j = i-1;
Linha 21: while ((j > -1) && (array [j] > aux)) {
Linha 22: array [j+1] = array [j];
Linha 23: j--;
Linha 24:}
Linha 25: array[j+1] = aux;
Linha 26:}
Linha 27:
Linha 28: System.out.println(" ");
Linha 29: System.out.print("Array Ordenado = { ");
Linha 30: for(i = 0; i < 5; i++){
Linha 31: if(I==4){
Linha 32: System.out.print(array[i] + " }");
Linha 33: }else{
Linha 34: System.out.print(array [i] + ", ");
Linha 35: }
Linha 36: }
Linha 37: }
Linha 38: }
Ao lado direito da figura tem um retângulo preto com duas linhas simulando a execução do programa.
Enumerando cada linhas temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 16/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um array de 5 posiçõ es. Na primeira posição está armazenado o valor 5, na
segunda posição está armazenado o velor 3, na terceira posição está armazenado o valor 8, na quarta posição
está armazenado o valor 2 e na ú ltima posição está armazenado o valor 6.
Considere o exemplo anterior como array = {5, 3, 8, 2, 6}.
Primeiramente, o algoritmo irá percorrer o array comparando todos os elementos até encontrar o menor
elemento. Encontrando o menor valor, o algoritmo irá trocá-lo com o valor da posição inicial. No exemplo, ele
irá comparar o array [0] com todos os elementos até o ú ltimo array, que é o array [4]. Assim, perceberá que o
valor que está no array [0] não é o de menor valor e irá realizar a troca,ficando com array = {2, 3, 8, 5, 6}.
Depois, ele fará todo o processo novamente, mas, agora, irá percorrer a partir do array [1], pois estamos na
segunda interação.
Na tabela a seguir, temos o passo a passo desde o início de como é realizada a ordenação utilizando o
Selection-Sort. Observe!
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 17/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra uma tabela de 2 colunas e 5 linhas. O título das colunas são,
respectivamente: Array, Comparação. Em cada linha temos:
Linha 1: {5, 3, 8, 2, 6} , Compara todos os elementos até achar o menor nú mero, faz a troca e coloca o menor
elemento no array[0].
Linha 2: {2, 3, 8, 5, 6} , Compara todos os elementos a partir do array[1] até achar o menor nú mero, faz a troca
e coloca o menor elemento no array[1].
Linha 3: {2, 3, 8, 5, 6} , Compara todos os elementos a partir do array[2] até achar o menor nú mero, faz a troca
e coloca o menor elemento no array[2].
Linha 4: {2, 3, 5, 8, 6} Compara todos os elementos a partir do array[3] até achar o menor nú mero, faz a troca e
coloca o menor elemento no array[3].
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 18/43
28/02/2023, 19:11 Estrutura de Dados
VAMOS PRATICAR?
Dado o array = [9, 5, 1, 3, 4, 7, 2], ordene os nú meros como em ordem cr
conforme o mé todo do Selection-Sort.
Agora que já sabemos como o nosso método de ordenação funciona, vamos apresentar o pseudocó digo do
algoritmo Selection-Sort.
#PraCegoVer: A imagem mostra um trecho de có digo de 11 linhas de programa. Enumerando cada linha
temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 19/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 20/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um trecho de có digo de 41 linhas de programa. Enumerando cada linha
temos:
Ao lado direito da figura tem um retângulo preto com duas linhas simulando a execução do programa.
Enumerando cada linhas temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 21/43
28/02/2023, 19:11 Estrutura de Dados
O algoritmo é simples de ser implementado e ocupa menos memó ria por não utilizar um vetor auxiliar para a
ordenação. Porém, uma desvantagem é o alto custo de movimentação de elementos no vetor e o fato de não
ser estável.
Assim, considerando um array com n elementos, a complexidade do algoritmo de ordenação Selection-Sort é
que:
VOCÊ O CONHECE?
Charles Antony Richard Hoare, nascido em 1934, formou-se na universidade de
Oxford em 1956. É conhecido por desenvolver o mé todo de ordenaçã o Quick-Sort em
1960, ao tentar traduzir um dicioná rio de inglê s para russo, ordenando as palavras. O
algoritmo de ordenaçã o é um dos mais utilizados do mundo até hoje.
Pivô
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 22/43
28/02/2023, 19:11 Estrutura de Dados
Ordenação crescente
Depois de escolhermos o pivô , reorganizamos o array a partir dele, de modo que os elementos
menores fiquem a sua esquerda e os elementos maiores fiquem a sua direita, caso a ordenação dos
dados seja crescente.
Fim do processo
Terminando esse processo, o pivô estará em sua posição final e haverá dois subconjuntos de
arrays não ordenados, um à direita e outro à esquerda do pivô . Depois, de maneira recursiva, o
algoritmo ordena o subconjunto dos elementos menores e maiores que o pivô , até que o array seja
ordenado.
Vamos ver como funciona a ordenação crescente de um array unidimensional com o algoritmo de ordenação
Quick-Sort a seguir.
#PraCegoVer: A imagem mostra um array de 5 posiçõ es. Na primeira posição está armazenado o valor 5, na
segunda posição está armazenado o velor 3, na terceira posição está armazenado o valor 8, na quarta posição
está armazenado o valor 2 e na ú ltima posição está armazenado o valor 6.
Considere o exemplo anterior como array = {5, 3, 8, 2, 6}.
Primeiramente, o algoritmo irá escolher um pivô . No caso, vamos pegar o nú mero 5 para ser o pivô . A
pró xima etapa é procurar à direita do pivô um nú mero menor que 5. Essa busca terá início no final do array.
Nesse caso, comparamos o pivô (5) com o nú mero 6 (array [4]). Como 6 não é menor que 5, o algoritmo não
faz alteraçõ es: array = {5, 3, 8, 2, 6}.
O pró ximo passo é comparar o pivô (5) com o nú mero 2 (array [3]). Como 3 é menor que 5, a troca é
realizada, ficando com array = {2, 3, 8, 5, 6}.
O passo seguinte é procurar à esquerda do pivô um nú mero maior que 5. Nesse caso, comparamos o pivô (5)
com o nú mero 3 (array [1]). Como 3 é menor que 5, o algoritmo não faz alteraçõ es, permanecendo em array =
{2, 3, 8, 5, 6}.
Depois, precisamos continuar a procurar à esquerda do pivô por um nú mero maior que 5. Como 8 é maior que
5, a troca é realizada e ficamos com array = {2, 3, 5, 8, 6}. Dessa forma, o nú mero 5 já está na sua posição final
e o algoritmo irá dividir o array em subconjuntos. O local em que o pivô foi alocado é que irá dividir os
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 23/43
28/02/2023, 19:11 Estrutura de Dados
conjuntos. Teremos, então, que {2, 3} {5} {8, 6}. Sendo assim, o algoritmo faz a escolha de um novo pivô em
cada subconjunto e percorre o algoritmo, reorganizando o array de maneira que os elementos menores que o
pivô fiquem à sua esquerda, enquanto os elementos maiores fiquem à direita, até que o array seja totalmente
ordenado.
A seguir, temos na tabela o passo a passo desde o início de como é realizada a ordenação utilizando o Quick-
Sort.
#PraCegoVer: A imagem mostra uma tabela de 5 colunas e 9 linhas. O título das colunas são,
respectivamente: Array, Comparação, Pivô , Busca, Troca. Em cada linha temos:
Linha 1: {5, 3, 8, 2, 6}, 6 < 5 ? , 5, Por um nú mero menor à direita do pivô , Não
Linha 6: {2, 3}, {5}, {8,6}, 3 < 2 ? , 2, Por um nú mero menor à direita do pivô , Não
Linha 7: {2}, {3}, {5}, {8,6} , Sem comparação, 6, Por um nú mero menor à direita do pivô ,
Linha 8: {2}, {3}, {5}, {8,6} , 8 > 6 ? , 6 , Por um nú mero maior à esquerda do pivô , Sim
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 24/43
28/02/2023, 19:11 Estrutura de Dados
VAMOS PRATICAR?
Dado o array = [9, 5, 1, 3, 4, 7, 2], ordene os nú meros corretamente em
crescente, pelo mé todo Quick-Sort.
Agora que já sabemos como o método de ordenação funciona, vamos apresentar o pseudocó digo do algoritmo
Quick-Sort. A escolha do pivô fica a critério do programador, sendo que podemos iniciar com o elemento mais
à esquerda (como o array [0]) ou, até mesmo, pegar a quantidade de elementos e dividir por dois, pegando o
nú mero no meio do array, como no có digo a seguir.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 25/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um trecho de có digo de 28 linhas de programas. Enumerando cada linha
temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 26/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 27/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 28/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um trecho de có digo com 56 linhas de programa. Enumerando cada linha
temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 29/43
28/02/2023, 19:11 Estrutura de Dados
Linha 43: }
Linha 44: System.out.println(" ");
Linha 45: System.out.print("Array Ordenado = { ");
Linha 46: quickSort(vetor, 0, vetor.length - 1);
Linha 47:
Linha 48: for (int i = 0; i < vetor.lengh; i++) {
Linha 49: if ( i == vetor.lenght - 1){
Linha 50: System.out.print(vetor[i] + " }");
Linha 51: } else {
Linha 52: System.out.print(vetor [i] + ", ");
Linha 53: }
Linha 54: }
Linha 55: }
Linha 56: }
Ao lado direito da figura tem um retângulo preto com duas linhas simulando a execução do programa.
Enumerando cada linhas temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 30/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra a ideia geral do algoritmo merge-sort em que dado um problema (que pode
ser representado por um conjunto de valores) devemos dividir esse problema no meio. Em seguida,
dividimos cada um dos subproblemas formados no meio novamente e continuamos assim sucessivamente
até que o problema se torne bem pequeno. No final, unimos as soluçõ es dos problemas pequenos.
Vamos ver como funciona a ordenação crescente de um array unidimensional com o algoritmo de ordenação
Merge-Sort.
#PraCegoVer: A imagem mostra um array de 5 posiçõ es. Na primeira posição está armazenado o valor 5, na
segunda posição está armazenado o velor 3, na terceira posição está armazenado o valor 8, na quarta posição
está armazenado o valor 2 e na ú ltima posição está armazenado o valor 6.
Considere o exemplo anterior como array = {5, 3, 8, 2, 6}.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 31/43
28/02/2023, 19:11 Estrutura de Dados
A primeira coisa a ser feita é dividir o tamanho do array ao meio. Caso o nú mero de elementos seja ímpar, um
subconjunto terá um elemento a mais. Assim, os subconjuntos ficam divididos na esquerda e direita, desta
maneira: array = {5, 3, 8},{2, 6}.
Depois, vamos dividir os subconjuntos da esquerda até que o subconjunto tenha tamanho 1, conforme vemos
a seguir:
array = {5, 3},{8},{2, 6}
array = {5},{3},{8},{2, 6}
A seguir, intercalamos os subconjuntos e percorremos o array para verificar se existe troca. No caso, 3 é
menor que 5, assim, trocamos a posição dos elementos, ficando com array = {3},{5},{8},{2, 6}.
Agora, vamos dividir os subconjuntos da direita até que o subconjunto tenha tamanho 1:
array = {3},{5},{8},{2, 6}
array = {3},{5},{8},{2},{6}
Depois que os elementos foram divididos, devemos comparar os subconjuntos. Nesse caso, comparamos se 3
é menor que 5. Como a comparação é verdade e já está em ordem, não ocorre uma troca, por isso, array = {3},
{5},{8},{2},{6}.
Não temos, por enquanto, com o que compararmos o 8, pois o elemento pertence ao grupo da esquerda que foi
dividido. Assim, vamos comparar se 2 é menor que 6. Como a comparação é verdade e já está em ordem,
também não ocorre uma troca.
Agora, vamos comparar o primeiro elemento do primeiro subconjunto com o primeiro elemento do segundo
subconjunto. No caso, 3 é menor que 8, então também não existe troca.
Se compararmos o segundo elemento do primeiro subconjunto com o primeiro elemento do segundo
subconjunto, temos que 5 é menor que 8, também não ocorrendo uma troca.
Em seguida, vamos comparar o primeiro elemento do primeiro subconjunto com o primeiro elemento do
primeiro subconjunto. Nesse caso, 2 é menor que 3, então reordenamos. Continuamos, então, a ordenação,
comparando se o 3 é menor que o 5 (reordena), até ordenar todos os elementos do array.
Na tabela a seguir, temos o passo a passo desde o início de como é realizada a ordenação utilizando o Merge-
Sort.
#PraCegoVer: A imagem mostra uma tabela de 5 colunas e 7 linhas. O título das colunas são,
respectivamente: Array, Divide, Troca, Intercala, Troca. Em cada linha temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 32/43
28/02/2023, 19:11 Estrutura de Dados
Linha 1: {5, 3, 8, 2, 6} , x, , , ,
Linha 2: {5, 3, 8} , {2, 6} , x, , , ,
Linha 3: {5, 3}, {8}, {2,6}, x, , , ,
Linha 4: {5}, {3}, {8}, {2,6} , x, , , , Troca, pois 5 é maior que 3.
Linha 5: {3},{5},{8}, {2,6} , x, , , ,
Linha 6: {3}, {5}, {8}, {2},{6}, , x, x, Compara oss elementos dos subconjuntos e intercala até que os elementos
estejam ordenados.
Linha 6: {2}, {3}, {5}, {6}, {8}, , , , ,
Dessa forma, terminamos de percorrer o array e ele está organizado em ordem crescente.
VAMOS PRATICAR?
Dado o array = [9, 5, 1, 3, 4, 7, 2], ordene os nú meros em ordem cresce
Merge-Sort. Depois, analise e compare o nú mero de interações que cada a
de ordenaçã o fez para ordenar o array. Você conseguiu ver as diferenç
influenciam no tempo de execuçã o do nosso algoritmo.
Agora que já sabemos como o nosso método de ordenação funciona, vamos apresentar o pseudocó digo do
algoritmo Merge-Sort.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 33/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 34/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostraum trecho de có digo de 56 linhas de programas. Enumerando cada linha
temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 35/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 36/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 37/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 38/43
28/02/2023, 19:11 Estrutura de Dados
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 39/43
28/02/2023, 19:11 Estrutura de Dados
#PraCegoVer: A imagem mostra um trecho de có digo de 77 linhas de programa. Enumerando cada linha
temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 40/43
28/02/2023, 19:11 Estrutura de Dados
Linha 42:
Linha 43: public static void sort (int array[], int l, int r) {
Linha 44: if (l < r) {
Linha 45: int m = (l+r)/2;
Linha 46:
Linha 47: sort(array, l , m);
Linha 48: sort(array, m+1, r);
Linha 49:
Linha 50: merge(array, l , m, r);
Linha 51: }
Linha 52: }
Linha 53:
Linha 54: public static void mostraArray(int array[]) {
Linha 55: for (int i = 0; i < array.length-1){
Linha 56: if (i == array. Length-1) {
Linha 57: System.out.print(array[i] + " }");
LInha 58: } else {
Linha 59: System.out.print(array[i] + ", ");
Linha 60: }
Linha 61: }
Linha 62: }
Linha 63:
Linha 64: public static void main(String args[]) {
Linha 65: int array[] = {5, 3, 8, 2, 6};
Linha 66:
Linha 67: System.out.print("Array Desordenado = {");
Linha 68: mostraArray(array);
Linha 69:
Linha 70: MyMergeSort ob = new MyMergeSort();
Linh 71: ob.sort(array, 0, array.length-1);
Linha 72:
Linha 73: System.out.println();
Linha 74: System.out.print("Array Ordenado + { ");
Linha 75: mostraArray(array);
Linha 76: }
Linha 77: }
Ao lado direito da figura tem um retângulo preto com duas linhas simulando a execução do programa.
Enumerando cada linhas temos:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 41/43
28/02/2023, 19:11 Estrutura de Dados
Sendo assim, pudemos aprender sobre alguns dos algoritmos mais utilizados, a complexidade de cada um e
suas vantagens e desvantagens. Descobrimos, inclusive, que existem algoritmos que são mais utilizados para
aumentar a eficiência, principalmente no fator tempo, como o Quick-Sort e o Merge-Sort, que são mais
complexos.
Síntese
Chegamos ao fim de mais uma unidade de estudos. Aqui, vimos a respeito da ordenação de dados a partir de
vários algoritmos, incluindo a complexidade e os exemplos de có digos implementados na linguagem de
programação Java de cada um deles.
Nesta unidade, você teve a oportunidade de:
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 42/43
28/02/2023, 19:11 Estrutura de Dados
Bibliografia
ALGORYTHMICS. Merge-sort with Transylvanian-saxon (German) folk dance. 23 abr. 2011. Disponível em:
https://www.youtube.com/watch?v=XaqR3G_NVoo&feature=youtu.be (https://www.youtube.com/watch?
v=XaqR3G_NVoo&feature=youtu.be). Acesso em: 29 jul. 2019.
KHAN ACADEMY. Ciência da Computação: algoritmos. 2019. Disponível em:
https://pt.khanacademy.org/computing/computer-science/algorithms#quick-sort
(https://pt.khanacademy.org/computing/computer-science/algorithms#quick-sort). Acesso em: 26 jul. 2019.
TAMASSIA, R.; GOODRICH, M. T. Estrutura de dados e algoritmos em Java. Porto Alegre: Bookman, 2006.
SZWARCFITER, J. L.; MARKENZON, L. Estruturas de dados e seus algoritmos. 3. ed. Rio de Janeiro: LTC,
2010.
ZIVIANI, N. Projeto de algoritmos: com implementaçõ es em JAVA e C++. São Paulo: Cengage Learning Editores,
2012.
https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 43/43