Basicamente, os tipos de algoritmos de ordenação podem ser resumidos a: Por seleção: seleciona o menor elemento, o segundo menor e assim por diante

Documentos relacionados
CHAPTER ONE. Uma árvore B de ordem "m" (máximo de filhos para cada nó) é uma árvore que atende as seguintes propriedades:

ALGORITMOS DE ORDENAÇÃO

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

Projeto e Análise de Algoritmos

Árvores binárias de busca

Métodos de Ordenação

Análise e Complexidade de Algoritmos

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

INF111 Programação II Aulas 11, 12, 13 Ordenação

Linguagem C: Ordenação

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Métodos de Classificação

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

Métodos de Ordenação Parte I

Métodos de Ordenação Parte 2

Bubble Sort. Tempo total O(n 2 )

Métodos de Ordenação Parte 3

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Algoritmos de Ordenação

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI1

Métodos de ordenação. Bubble sort:

Programação de Computadores Ordenação de Arranjos

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: ClaudioQuick F. M.

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

BCC202 - Estrutura de Dados I

Programação Estruturada

USP - ICMC - SSC SSC o. Semestre Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Automação ]

BCC202 - Estrutura de Dados I

Ordenação - Motivação

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Estruturas de Dados Algoritmos de Ordenação

Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira Anilton Joaquim da Silva

Ordenação. Prof. Jonas Potros

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Existem duas categorias de algoritmos de ordenação: Os algoritmos de ordenação são avaliados de acordo com os seguintes critérios:

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2009/2010

Memória secundária. Memória secundária

Algoritmos de Ordenação

Classificação e Pesquisa

SCC-601 Introdução à Ciência da Computação II. Ordenação e Complexidade Parte 3. Lucas Antiqueira

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - I

Algoritmos de ordenação: Bucketsort, Radixsort e Seleção

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

HeapSort Filas de Prioridade Heap. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Aula 12 Métodos de Classificação: - Classificação por Inserção Direta - Classificação por Seleção Direta

Ordenação em Memória Primária Estrutura de Dados II

Centro de Informá-ca Universidade Federal de Pernambuco. Vinicius Cardoso Garcia 2011 Vinicius Cardoso Garcia

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

O Problema da Ordenação Métodos de Ordenação Parte 1

Ordenação de Vectores

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Ordenação. Insertion Sort

Ordenação: HeapSort. Prof. Túlio Toffolo BCC202 Aula 17 Algoritmos e Estruturas de Dados I

Extra- Algoritmos de Ordenação

Algoritmos de Ordenação: Um Estudo Comparativo

Filas de prioridade. Marcelo K. Albertini. 3 de Dezembro de 2013

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

Carlos Eduardo Batista. Centro de Informática - UFPB

ALGORITMOS AVANÇADOS. UNIDADE III Algoritmo de Ordenação por Intercalação (Mergesort) Luiz Leão

Classificação e Pesquisa Aula 6 Métodos de Ordenação: ShellSort e QuickSort. Prof. Esp. Pedro Luís Antonelli Anhanguera Educacional

Capacitação em Linguagem C Parte 2

Ordenação por Seleção Métodos de Ordenação Parte 3

Métodos de Ordenação

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Programação de Computadores II. Cap. 17 Busca

BCC202 - Estrutura de Dados I

Algoritmos de Ordenação

ORDENAÇÃO DE ARQUIVOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Métodos de Ordenação Parte 4

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2008/2009

INF 1007 Programação II

Classificação por Seleção - selection sort

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

Algoritmos e Estruturas de Dados LEE 2013/2014. popular devido à facilidade de implementação e eficiência

Algoritmos de Ordenação: MergeSort

Análise e Complexidade de Algoritmos

Classificação por Particionamento

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Conteúdo. Busca Seqüencial. Busca Binária. Algoritmos de Ordenação e Busca e sua Análise de Complexidade. Alneu de Andrade Lopes Rosane Minghim

Quicksort. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

UNIVERSIDADE FEDERAL DO PIAUÍ COLÉGIO TÉCNICO DE TERESINA-TÉCNICO EM INFORMÁTICA DISCIPLINA: ESTRUTURA DE DADOS PROFESSOR: Valdemir Junior

Algoritmos de Ordenação: QuickSort

Ordenação por Intercalação Métodos de Ordenação Parte 4

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Transcrição:

/ Ordenação de dados / 1 Ordenação de dados Frequentemente, é necessário que os dados devam ser armazenados obedecendo uma determinada ordem. A ordenação de dados é uma atividade relevante e fundamental em processamento de dados. Ordenação corresponde ao método de rearranjar um conjunto de objetos em uma ordem crescente ou decrescente e tem como objetivo facilitar a recuperação dos itens do conjunto Alguns algoritmos podem explorar a ordenação dos dados para operar de maneira mais eficiente, do ponto de vista de desempenho computacional. Para obtermos os dados ordenados, temos basicamente duas alternativas: ou inserimos os elementos na estrutura de dados respeitando a ordenação (dizemos que a ordenação é garantida por construção), ou, a partir de um conjunto de dados já criado, aplicamos um algoritmo para ordenar seus elementos. As principais linguagens de programação atuais possuem funções para ordenação de dados. Entretando, muitas vezes é preciso implementar extensões enquanto a operação de ordenação está em curso, seja para adicionar propriedades aos dados, seja para guardar determinadas informações desse processo. Basicamente, os tipos de algoritmos de ordenação podem ser resumidos a: Por troca: troca os elementos ordenando-os Por seleção: seleciona o menor elemento, o segundo menor e assim por diante Por inserção: reinsere os elementos na estrutura reordenando os mesmos Classificação quanto à estabilidade: Métodos instáveis: a ordem relativa dos itens com chaves iguais é alterada durante o processo de ordenação Métodos estáveis: se a ordem relativa dos itens com chaves iguais mantém-se inalterada durante o processo. Exemplo: se uma lista dos funcionários é ordenada pelo campo Salário, um método estável produz uma lista em que os funcionários com o mesmo salário aparecem em ordem alfabética Alguns dos métodos de ordenação mais eficientes não são estáveis. Classificação quanto ao conjunto de registros: Ordenação Interna: o conjunto de registros cabe todo em na memória principal Ordenação por inserção (direta e Shell Sort) Ordenação por troca (Bolha e QuickSort) Ordenação por seleção (Direta e HeapSort) Ordenação por distribuição (distribuição de chaves e RadixSort) Ordenação por intercalação (MergeSort)

/ Ordenação de dados / 2 Ordenação Externa: o conjunto de registros não cabe completamente em memória principal, e deve ser armazenado em disco ou fita. Medidas de complexidade levam em conta: O número de comparação entre as chaves O número de trocas entre os itens Classificação quanto aos métodos de ordenação: 1. Métodos Simples: mais recomendados para conjuntos pequenos de dados. Usam mais comparações, mas produzem códigos menores e mais simples Ordenação por Seleção (Selection Sort) Ordenação por Inserção (Insertion Sort) Ordenação por Seleção e Troca (Bubble Sort) 2. Métodos Eficientes ou Sofisticados: adequados para conjuntos maiores de dados. Usam menos comparações, porém produzem códigos mais complexos e com muitos detalhes. Ordenação por Inserção através de incrementos decrescentes (ShellSort) Ordenação por Particionamento (QuickSort) Ordenação de Árvores (HeapSort) Ordenação por seleção Um dos algoritmos mais simples, recomendado para conjuntos pequenos. A idéia é sempre procurar o menor elemento do vetor e inseri-lo no início do vetor. Procuramos o menor valor do vetor e colocamos ele em vetor[. Procuramos o menor valor do vetor excluindo o já colocado e colocamos ele em vetor[. E assim vamos indo até termos todo o vetor ordenado. 1. para i 1 até tamanho-1, faça 2. minimo i 3. para j i+1 até tamanho, faça 4. se vetor[j] < vetor[minimo], então 5. minimo j 6. fim-se 7. fim-para 8. temp vetor[i]

9. vetor[i] vetor[minimo] / Ordenação de dados / 3 10. vetor[minimo] temp 1. fim-para Partindo sempre a partir do último elemento reordenado (a partir do i), o programa procura o menor elemento no vetor e o substitue pelo elemento i atual. O programa recebe o seguinte vetor. 5 3 7 8 2 5 Aí ele começa com. 5 3 7 8 2 5 Ele marca o próprio índice i como a variável minimo, que é sempre o menor elemento do vetor. Então, ele faz um para de até o comprimento do vetor, com o objetivo de descobrir qual o menor elemento...., portanto. 5 3 7 8 2 5..., portanto não mexemos em nada...., portanto não mexemos em nada...., portanto.

/ Ordenação de dados / 4 5 3 7 8 2 5..., portanto não mexemos em nada. Agora substituímos o minimo] pelo i], formando com isto o novo vetor: 2 3 7 8 5 5 E assim vamos fazendo com os outros elementos até que todo o vetor esteja ordenado. Resumo do algoritmo: Seleciona o elemento de menor valor e o troca pelo primeiro. Faz-se o mesmo com os elementos restantes. executa-se o processo tantas vezes quanto o número de elementos no array menos um varre o array a partir dos elementos ainda não ordenados void selecao(int a[]) int r = TAM -1; int i, j, t; for (i = 0; i < r; i++) int min = i; for (j = i+1; j <= r; j++) if (a[j] < a[min]) min = j; t = a[i]; a[i] = a[min]; a[min] = t; Ordenação por inserção Também conhecida como Insertion Sort, é um dos métodos mais simples para ordenar um array. Um exemplo típico ocorre num jogo de cartas. Para classificar as cartas em uma mão, uma carta é retirada, muda-se as cartas restantes e em seguida a carta retirada é inserida no no local correto. Este processo é repetido até que todas as cartas estejam na seqüência correta.

/ Ordenação de dados / 5 Essa opção é boa quando temos uma entrada pequena de dados. Para entradas grandes pode se consumir muito tempo de processamento. 1. para j 2 até comprimento do vetor, faça 2. elemento vetor[j] 3. i j - 1 4. enquanto i > 0 e vetor[i] > elemento, faça 5. vetor[i + vetor[i] 6. i i - 1 7. fim-enquanto 8. vetor[i + elemento 1. fim-para Vamos iniciar com o seguinte vetor v. 5 3 7 8 2 5 Aí o código me manda começar com e iterar até o comprimento do vetor (6). A primeira ordem que ele me dá é para armazenar o elemento ( ) na variável elemento. Para facilitar toda a explicação eu vou sempre pintar de cinza o onde eu estou (no caso, o segundo elemento do vetor, 3) e de preto o vetor ainda não ordenado (elementos ). 5 3 7 8 2 5 Então ele me diz que. Portanto,. E agora ele me faz um enquanto (que poderia ser substituído por para) onde meu i deverá ir diminuindo. Vamos entrar no loop... Bom, meu é maior que 0. é maior que o? Sim, então vamos entrar no corpo do enquanto... Aqui ele me manda fazer um, que nesse caso é fazer um.

/ Ordenação de dados / 6 5 5 7 8 2 5 E agora subtrae de i um valor. Portanto,. Ele retorna ao enquanto, mas agora não satisfazemos a condição, por isso saímos do enquanto. Então ele pede para ( ). Portanto, o vetor fica assim: 3 5 7 8 2 5 E incrementamos o j, agora. 3 5 7 8 2 5... E? Não! Portanto, não entramos no enquanto. (nenhuma mudança) E lá vamos para e continuando até que vamos ter o vetor ordenado: 2 3 5 5 7 8 Resumo do processo: reinsere os elementos no array reordenando o mesmo ordena os dois primeiros elementos do terceiro elemento em diante, os valores são inseridos em relação aos elementos já ordenados Em termos gerais, o algoritmo percorre um vetor de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. Começando na parte superior da matriz na Figura a, extraímos a 3. Em seguida, os

/ Ordenação de dados / 7 elementos acima são deslocada para baixo até encontrar o local correto para inserir o 3. Esse processo se repete na b com o próximo número. Finalmente, na c, completa-se o ciclo através da inserção de 2 na posição correta. Assumindo que existem n elementos na matriz, é preciso percorrer através de n - 1 entradas. Para cada entrada, talvez seja necessário examinar e mudar até n - 1 entradas de outros, resultando em um algoritmo O(n2). Na ordenação por inserção não há memória extra necessária. Características: O tipo de inserção é do tipo estável de ordenação interna. Menor número de trocas e comparações entre os algoritmos de ordenação quando o vetor está ordenado. void insercao(int n, int vetor[]) int j,i,key; for(j = 1; j < n; j++) key = vetor[j]; i = j - 1; while(i >= 0 && vetor[i] > key) vetor[i + = vetor[i]; i = i - 1; vetor[i + = key; BubbleSort O Bubblesort, ou ordenação em bolha, é um dos mais populares dos algoritmos para ordenação por causa da fácil memorização de funcionamento e como é fácil a sua implementação. O algoritmo recebeu este nome pela imagem usada para descrevê-lo: os elementos maiores são mais leves, e sobem como bolhas até suas posições corretas. Consiste basicamente em intercalar elementos, por isso se enquadra na categoria de ordenação por intercalação. Com uma estrutura de dados desordenada inicia-se o algoritmo pelo primeiro elemento, depois faz-se a comparação dele com todos os que

/ Ordenação de dados / 8 estão depois dele na estrutura desordenada. Quando dois elementos estão fora de ordem, há uma inversão e esses dois elementos são trocados de posição, ficando em ordem correta. Assim, o primeiro elemento é comparado com o segundo. Se uma inversão for encontrada, a troca é feita. Em seguida, independente se houve ou não troca após a primeira comparação, o segundo elemento é comparado com o terceiro, e, caso uma inversão seja encontrada, a troca é feita. O processo continua até que o penúltimo elemento seja comparado com o último. 1. proc bubblesort(int[] arr) 2. int tamanho <- tam(arr); 3. int i, aux; 4. para i de 1 incr 1 até tamanho-1 faça 5. para j de tamanho-1 incr -1 até j i faça 6. se arr[j- > arr[j] então 7. aux <- arr[j-; 8. arr[j- <- arr[j]; 9. arr[j] <- aux; void bolha (int ]) int n = TAM; int i,j; for (i=n-1; i>=1; i--) int troca = 0; for (j=0; j<i; j++) if (j]>j+) int temp = j]; j] = j+; j+ = temp; troca = 1; if (troca == 0) return; MergeSort É um algoritmo que segue uma técnica de dividir para conquistar na base de sua idéia principal. O algoritmo Mergesort possibilita a ordenação de dados quebrando o problemachave em pedaços menores,organizando trechos de dados separados para em seguida, juntar os resultados formando um vetor ordenado.

/ Ordenação de dados / 9 A lógica básica é a seguinte: ordenar uma estrutura significa ordenar várias subestruturas internas já ordenadas, caso essas estruturas não estejam ordenadas, basta ordená-las pelo mesmo método (ordenar suas subestruturas internas). Por exemplo: ordenar 6, 3, 4, 8, 1, 2, 3, 5. O algoritmo irá dividir em pares ordenados: 3,6, 4,8, 1,2, 3,5, depois ir fazendo o merge desses dados, ou seja, juntando-os em dois pares ordenados: 3,4,6,8, 1,2,3,5, depois juntar novamente: 1,2,3,3,4,5,6,8. No final do algoritmo a seqüência inicial está ordenada a partir de divisões. Por sua base bem estruturada esse algoritmo tem tempo médio bem rápido. Resumo do funcionamento: Dividir para conquistar Divide-se o array ao meio e aplica o algoritmo às duas metades separadamente ao chegar na situação em que o array são dois elementos, ordena os mesmos algoritmo recursivo Um dos principais problemas com o MergeSort é que ele faz uso de um array auxiliar. Vantagens: É eficiente para ordenação externa Fácil implementação Recomendado para aplicações com restrição de tempo Desvantagens: Utiliza memória auxiliar Alto consumode memória Complexidade do algoritmo Melhor caso: nunca é necessário trocar após as comparações Caso médio: há necessidade de trocas após as comparações Pior caso: sempre é necessário efetuar a troca após as comparações A complexidade do merge sort é a mesma para o pior, médio e melhor caso. Independente da situação dos dados no vetor, o algoritmo irá sempre dividir e intercalar os dados void merge(int* input, int p, int r) int mid = floor((p + r) / 2); int i1 = 0; int i2 = p; int i3 = mid + 1; // Temp array int temp[r-p+; // Merge in sorted form the 2 arrays while ( i2 <= mid && i3 <= r ) if ( input[i < input[i ) temp[i1++] = input[i2++]; else temp[i1++] = input[i3++];

// Merge the remaining elements in left array while ( i2 <= mid ) temp[i1++] = input[i2++]; / Ordenação de dados / 10 // Merge the remaining elements in right array while ( i3 <= r ) temp[i1++] = input[i3++]; // Move from temp array to master array for ( int i = p; i <= r; i++ ) input[i] = temp[i-p]; void merge_sort(int* input, int p, int r) if ( p < r ) int mid = floor((p + r) / 2); merge_sort(input, p, mid); merge_sort(input, mid + 1, r); merge(input, p, r); Quicksort É considerado como o mais rápido entre os principais métodos de ordenação. A idéia por trás do algoritmo é escolher um valor "médio" (o valor do meio, também chamado pivô, que pode não corresponder exatamente ao valor do meio do vetor, depois de este estar ordenado) do vetor, passar todos os valores maiores do que ele para a frente e todos os menores para trás. A grande vantagem desse algoritmo é que ele pode ser muito eficiente. O melhor caso ocorre quando o elemento pivô representa o valor mediano do conjunto dos elementos do vetor. Se isto acontece, após o posicionamento do pivô em sua posição, restará dois subvetores para serem ordenados, ambos com o número de elementos reduzido a metade, em relação ao vetor original. Ficamos então com o vetor dividido em duas partes, uma tem todos os valores menores que o valor escolhido, a outra tem todos os valores maiores que o valor escolhido. Aplicamos agora o algoritmo a cada uma das partes. O processo é repetido até atingirmos partes de tamanho um. Resumo de funcionamento: Similar ao mergesort: Seleciona-se um valor base para dividir o array em duas partes, uma menor que o valor escolhido e outra maior Aplica-se o algoritmo recursivamente para cada uma das partes

O Quicksort é um algoritmo de ordenação não-estável. int Partition(int low, int high, int arr[]) int i, high_vac, low_vac, pivot; pivot = arr[low]; while(high>low) high_vac = arr[high]; / Ordenação de dados / 11 while(pivot<high_vac) if(high <= low) break; high--; high_vac = arr[high]; arr[low] = high_vac; low_vac = arr[low]; while(pivot > low_vac) if(high <= low) break; low++; low_vac = arr[low]; arr[high] = low_vac; arr[low] = pivot; return low; void Quick_sort(int low, int high, int arr[]) int Piv_index; if(low < high) Piv_index=Partition(low, high, arr); Quick_sort(low,Piv_index - 1, arr); Quick_sort(Piv_index + 1, high, arr); ShellSort Shell Sort é uma ordenação interna e não estável. É mais eficiente que a ordenação por inserção. O algoritmo difere do método de inserção direta pelo fato de no lugar de considerar o array a ser ordenado como um único segmento, ele considera vários segmentos sendo aplicado o método de inserção direta em cada um deles. Não é aconselhável a sua implementação para sequências grandes, mas possui uma boa

/ Ordenação de dados / 12 eficiência para as pequenas e medianas. Abaixo um exemplo de Shell Sort é ilustrado. Começamos por fazer uma espécie de inserção usando um espaçamento de duas. No primeiro quadro examinarmos os números 3,5 e 1. Extraindo 1, mudamos 3 para baixo um slot. Em seguida, examinamos os números 5, 2 e 4. Extraímos 2, transferir 5 para baixo e insirimos 2. Depois da ordenação com um espaçamento de dois, uma passagem final é feita com um espaçamento de uma posição. void shellsort(int * vet, int size) int i, j, value; int gap = 1; do gap = 3*gap+1; while(gap < size); do gap /= 3; for(i = gap; i < size; i++) value =vet[i]; j = i - gap; while (j >= 0 && value < vet[j]) vet [j + gap] =vet[j]; j -= gap; vet [j + gap] = value; while ( gap > 1);

Algoritmo Heapsort / Ordenação de dados / 13 Esse algoritmo tem tempo de execução de um algoritmo de ordenação por intercalação, e faz as suas operações localmente, sempre apenas um número constante de elementos é armazenados fora da estrutura de dados, como é feito o algoritmo por inserção. Mas o que ele tem de interessante é a forma que ele arranja os dados para depois ordená-los, ele utiliza uma estrutura chamada de heap ou monte, que é uma arvore binária que é extremamente importante para vários conceitos e problemas computacionais, pois depois de ordenados os dados, podemos, por exemplo, saber em que nível da árvore se encontra determinado item, operações sobre arvores binárias são conceitos muito importantes para outras estruturas como grafos. Referências CELES FILHO, Waldemar; Cerqueira, Renato; Rangel, José Lucas. Introdução a estrutura de dados: com técnicas de programação em C. Rio de Janeiro : Elsevier, 2004 7a. Impressão. DROZDEK, Adam; tradução Luiz Sérgio de Castro Paiva. Estrutura de dados e algoritmos em C++. São Paulo: Cengage Learning, 2010. MANZANO, José Augusto N. G.; Oliveira, Jayr Figueiredo de. Algoritmos: lógica para desenvolvimento de programação de computadores. São Paulo : Érica, 2010. SAVITCH, Walter. C++ absoluto. São Paulo: Addison Wesley, 2004. SILVA FILHO, Antônio Mendes da. Introdução à programação orientada a objetos com C++. Rio de Janeiro : Elsevier, 2010. SZWARCFITER, L. J.e MARKENZON, L. Estrutura de Dados e Seus Algoritmos. Rio de Janeiro: LTC - Livros Técnicos e Científicos, 1994. 2. edição revista. TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J.; tradução Teresa Cristina Félix de Souza. Estruturas de dados usando C. São Paulo : MAKRON Books, 1995. Cap 6. VELOSO, P; SANTOS, C; AZEREDO, P e FURTADO, A. Estrutura de Dados. Rio de Janeiro: Campus, 2000. WIRTH, N. Algoritmos e Estrutura de Dados. Rio de Janeiro: LTC - Livros Técnicos e Científicos, 1999. 2. edição revista. Cap. 2.