Especificação do trabalho T2

Documentos relacionados
Algoritmos de Ordenação em LISP

Projeto e Análise de Algoritmos

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

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

Estruturas de Dados Algoritmos de Ordenação

Métodos de Ordenação Parte 3

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

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

ALGORITMOS DE ORDENAÇÃO

Bubble Sort. Tempo total O(n 2 )

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

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

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

Análise empírica de algoritmos de ordenação

Algoritmos de Ordenação

Algoritmos de Ordenação

Estrutura de Dados. Diego Silveira Costa Nascimento

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

Algoritmos de ordenação Quicksort

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

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

Algoritmos de Ordenação: QuickSort

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

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

Ordenação. Prof. Túlio A. M. Toffolo Prof. Marco Antonio M. Carvalho BCC402 Aula 04 Algoritmos e Programação Avançada

Ordenação em Tempo Linear. Leitura: Cormen Capítulo 8

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

Radix Sorting. Várias aplicações têm chaves que são inteiros, definidos dentro de um intervalo

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

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

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

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

Projeto e Análise de Algoritmos

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

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

CIC 110 Análise e Projeto de Algoritmos I

Estruturas de Dados 2

MC102 - Algoritmos e programação de computadores. Aula 16: Busca e Ordenação em vetores

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

Projeto e Análise de Algoritmos

Algoritmos e Estruturas de Dados

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

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

Recuperação P1 de Estrutura de Dados

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

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

Princípio da Multiplicação. > Corretude de Algoritmos Princípios de Contagem e Enumeração Computacional 0/18

Métodos de Ordenação

5. Algoritmos de Ordenação

Classes, Herança e Interfaces

Estruturas Discretas

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

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

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

Métodos de Ordenação Parte 2

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

Ordenação. Prof. Jonas Potros

Programação Estruturada

Lista 1. 8 de abril de Algorithms: Capítulo 0, exercícios 1 e 2. Tardos: Todos exercícios do cap 2 do livro texto, exceto 7 e 8 letra b.

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

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

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

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

Projeto e Análise de Algoritmos

Análise e Complexidade de Algoritmos

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

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

Divisão-e-Conquista ( ) CAL ( ) MIEIC/FEUP. ./rr (1) Técnicas de Concepção de Algoritmos

Análise e Complexidade de Algoritmos

Ordenação. Insertion Sort

Algoritmos de Ordenação

Ordenação e Pesquisa

Quicksort Letícia Rodrigues Bueno

Análise de algoritmos

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

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Aula 19: Métodos eficientes de ordenação

Prova Substitutiva PMR3201 1o. semestre 2018 Prof. Thiago Martins

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

Web site. Profa. Patrícia Dockhorn Costa.

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

INSTITUTO SUPERIOR TÉCNICO Algoritmos e Estruturas de Dados

TCC 00308: Programação de Computadores I Introdução

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

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

Licenciatura em Informática Introdução a Ciência dos Computadores 1º Ano

Prova 1 PMR2300 / PMR3201 1o. semestre 2015 Prof. Thiago Martins

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

Paradigmas de programação

Métodos de Ordenação Parte 4

Métodos de Ordenação Parte I

Estruturas de Dados Encadeadas

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

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

2 Erro comum da indução. 3 Corretude de Algoritmos. > Indução Forte X Indução Fraca Erro comum da indução Corretude de Algoritmos 0/17

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Transcrição:

Especificação do trabalho T2 Conforme o plano de ensino, ao trabalho T2 será atribuída nota de acordo com as seguintes diretrizes e os critérios de avaliação abaixo: 1. Entrega de relatório O relatório do trabalho T2 deverá ser impresso e assinado pelos membros da equipe (no máximo 2 alunos) e entregue ao professor em aula expositiva ou de laboratório. Somente será atribuída nota aos alunos que assinarem o trabalho impresso. (Não serão aceitos trabalhos colocados em caixa de correspondência ou entregues fora do horário de aula). O último dia de entrega será 26/10/2007. Ao aluno que não entregar (ou não assinar) seu trabalho até essa data será atribuída nota zero. Os critérios de avaliação do relatório são os seguintes, onde o valor de cada item avaliado está entre parênteses: Forma (1,0): precisão técnica do texto, qualidade do documento impresso, separação em seções, uso correto de referências bibliográficas, de acordo com as melhores práticas de metolodogia científica, aderência às especificações do trabalho. Algoritmo em pseudo-código (1,0): o algoritmo deve ser escrito em pseudo-código procedural (sem orientação a objetos) e o mais independente possível de linguagem de programação. Para um exemplo de como escrever em pseudo-código, veja exemplos de algoritmos descritos em [1]. Será verificada a precisão formal da especificação do algoritmo. Cada linha do algoritmo deve ser numerada. Em seguida, deve constar uma descrição o algoritmo em linguagem natural, usando o número das linhas para explicar ao leitor como o algoritmo funciona através de uma visita guiada a cada linha do algoritmo. Código assembly (1,0): código em linguagem de montagem do MIPS R2000, podendo conter pseudo-instruções implementadas pelo SPIM. Cada linha do código assembly deve ser numerada e comentada. Mapeamento entre linhas do pseudo-código e linhas do código assembly (1,0): incluir uma tabela onde cada linha seja composta por um par (Lcódigo, Lalgoritmo), mostrando a correspondência entre cada linha do assembly e a respetiva linha do algoritmo. Conclusões (1,0): descreva os procedimentos experimentais (procedimentos de teste) adotados para verificar o correto funcionamento do código, e comente as otimizações realizadas no código e qual o seu impacto no desempenho e/ou no tamanho do código. 2. Demonstração em laboratório As datas das apresentações serão determinadas mediante sorteio. Apresentação (1,0): será premiada a didática da apresentação dos principais pontos do programa, desde a instrumentação para o procedimento de teste, passando pela execução, até a monitoração dos resultados. Todos os membros da equipe deverão estar preparados para fazer a apresentação. O professor escolherá na ocasião, qual aluno fará a apresentação. Arguição (2,0): serão feitas perguntas sobre o algoritmo e sobre o código, ou para esclarecer dúvidas do relatório. As perguntas serão feitas a quaisquer dos componentes da equipe. Execução correta (2,0): será verificada a correção do funcionamento, usando o procedimento de teste fornecido pelos autores, bem como outros procedimentos de teste solicitados pelo professor.

3. Estrutura e formato do relatório O relatório deve conter as seguintes seções: Capa (Título, identificação da disciplina, identificação da equipe) 1. Descrição do algoritmo (pseudo-código e sua descrição em linguagem natural) 2. Descrição do código em linguagem de montagem (código assembly e tabela de mapeamento algoritmo-código) 3. Conclusões 3.1 Descrição dos experimentos 3.2 Comentários sobre otimizações 4. Referências bibliográficas O texto deve ser formatado como segue: parágrafos descritivos em fonte Times New Roman 12, elementos do algoritmo e do código em Courier 12 (e.g. add $s1, $s2, $s3). Parágrafos alinhados ( justify ) à direita e à esquerda. O trabalho não deve exceder 6 páginas. 4. Temas Um tema diferente será atribuído a cada equipe. Os temas serão sorteados e o resultado informado por e-mail. Ao final deste documento está a lista de temas e uma especificação inicial em pseudo-código. As especificações aqui disponíveis muitas vezes não estão suficientemente formalizadas e servem apenas de referência para que os alunos reconheçam o algoritmo que implementarão. Favor consultar as referências disponibilizadas e a literatura especializada para melhorar a precisão do pseudo-código. Imagina-se que os alunos refinarão o pseudo-código aqui mostrado como referência, como parte de seu trabalho, em seus relatórios. Dúvidas remanescentes sobre a especificação do trabalho devem ser dirigidas a Alexandre Mendonça (mendonca@inf.ufsc.br), estagiário de docência da disciplina. Não é atribuição do estagiário de docência responder sobre dúvidas conceituais sobre os algoritmos em si ou sobre o código assembly, mas somente sobre a dúvidas quanto à especificação dos temas da lista abaixo. 5. Referência bibliográfica [1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. (disponível na biblioteca universitária da UFSC).

1 - Ordenação pelo método Quick-Sort O Quicksort adota a estratégia de divisão e conquista. Os passos são: 1. Escolha um elemento da lista, denominado pivô; 2. Rearranje a lista de forma que todos os elementos anteriores ao pivô sejam menores ou iguais a ele, e todos os elementos posteriores ao pivô sejam maiores ou iguais a ele. Ao fim do processo o pivô estará em sua posição final. Essa operação é denominada partição; 3. Recursivamente ordene a sublista dos elementos menores e a sublista dos elementos maiores; A base da recursão são as listas de tamanho zero ou um, que estão sempre ordenadas. O processo é finito pois a cada iteração pelo menos um elemento é posto em sua posição final e não será mais manipulado na iteração seguinte. Pseudo-código do algoritmo: Quicksort(A,p,r) 1. if p<r then q = partition(a,p,r) 2. quicksort(a,p,q) 3. quicksort(a,q+1,r) Partition(A,p,r) 1. x=a[p] 2. i=p-1 3. j=r+1 4. while true 5. do repeat j=j-1 6. until A[j]<=x 7. repeat i=i+1 8. until A[i]>=x 9. if i<j the exchange A[i] <->A[j] 10. else return j [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] http://pt.wikipedia.org/wiki/quick_sort [3] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

2 - Ordenação pelo método de selection sort O Selection Sort utiliza um o conceito de "selecionar o elemento mais apto". Ele seleciona o menor ou maior valor do vetor p.ex. e passa para a primeira (ou última posição dependendo da ordem requerida), depois o segundo menor para a segunda posição e assim sucessivamente com (n-1) elementos restantes até os dois últimos. Pseudo-código do algoritmo: 1. para i=0 até n-1 2. mínimo=i 3. para j=i+1 até N 4. se vetor[j]<vetor[mínimo] 5. mínimo=j 6. auxiliar=vetor[i] 7. vetor[i]=vetor[mínimo] 8. vetor[mínimo]=auxiliar Refêrencias: [1] http://pt.wikipedia.org/wiki/selection_sort [2] http://pt.wikibooks.org/wiki/estrutura_de_dados_i/algoritmos_de_ordenação [3] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

3 - Ordenação pelo método de Insertion sort Insertion sort, ou ordenação por inserção, é um simples algoritmo de ordenação, eficiente quando aplicado a um pequeno número de elementos. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. O algoritmo de inserção funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o pôquer. Pseudo-código do algoritmo: 1. insere(array vetor, int tamanho, valor) { 2. int i = tamanho - 1; 3. while (i >= 0 && vetor[i] > valor) { 4. vetor[i + 1] = vetor[i]; 5. i=i-1; 6. } 7. vetor[i + 1] = valor; 8. } 1. insertionsort(array vetor, int tamanho) { 2. for (int i = 1; i < tamanho; i++) 3. insere(vetor, i, vetor[i]); 4. } [1] http://pt.wikipedia.org/wiki/insertion_sort [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

4 - Ordenação pelo método de Counting sort O algoritmo de counting sort assume que cada um dos n elementos da entrada é um inteiro no intervalo [1,k] para um inteiro k. A idéia básica do algoritmo de counting sort é determinar, para cada elemento da entrada x, o número de elementos menores que x. Esta informação pode ser utilizada para posicionar o elemento x diretamente na sua posição no array de saída. Por exemplo, se existem 17 elementos menores que x, então x pertence a posição 18 no array de saída. Pseudo-Código: No algoritmo em pseudo-código assumimos que a entrada é o array A[] e portando tamanho de A[]=n. Necessitamos de outros 2 arrays o array B[] que contém a saída ordenada e um array temporário C[]. CountingSort(A,B,k) 1. for i=1 to k 2. do C[i]=0 3. for j=1 to lenght[a] 4. do C[A[j]]= C[A[j]]+1 # C agora contem o numero de elementos igual a i 5. for i=2 to k 6. do C[i]=C[i]+c[i-1] 7. #C agora contem o numero de elementos menor ou igual a i 8. for l=lenght[a] down to 1 9. do B[C[A[j]]]= A[j] 10. C[A[j]] = C[A[j]]-1 [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] http://en.wikipedia.org/wiki/counting_sort [3] http://pt.wikipedia.org/wiki/counting_sort

5 - Ordenação pelo método de HeapSort O heapsort utiliza uma estrutura de dados chamada heap para ordenar os elementos a medida que os insere na estrutura. Assim, ao final das inserções, os elementos podem ser sucessivamente removidos da raiz da heap, na ordem desejada. Para uma ordenação crescente, deve ser construído um heap máximo (o maior elemento fica na raiz). 1. heapsort(int a[], int n){ 2. int i = n/2, pai, filho; 3. int t; 4. while true{ 5. if (i > 0){ 6. i=i-1; 7. t = a[i]; 8. }else{ 9. n=n-1; 10. if (n == 0) return; 11. t = a[n]; 12. a[n] = a[0]; 13. } 14. pai = i; 15. filho = i*2 + 1; 16. while (filho < n){ 17. if ((filho + 1 < n) && (a[filho + 1] > a[filho])) 18. filho=filho+1; 19. if (a[filho] > t){ 20. a[pai] = a[filho]; 21. pai = filho; 22. filho = pai*2 + 1; 23. } 24. else 25. break; 26. } 27. a[pai] = t; 28. } 29.} [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] http://pt.wikipedia.org/wiki/heapsort [3] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

6 - Ordenação pelo método de CockTail Sort O Algoritmo de Cocktail sort é uma pequena variação do bubble sort. A diferença é que ao invés de percorrer a lista do fim para o início, ele passa alternadamente do fim para o início e então do início para o fim Algoritmo em Pseudo-Código: 1. cocktail_sort(list[], list_length){ 2. bottom = 0; 3. top = list_length - 1; 4. swapped = true; 5. while(swapped == true){ 6. swapped = false; 7. for(i = bottom; i < top; i = i + 1){ 8. if(list[i] > list[i + 1]){ 9. swap(list[i], list[i + 1]); 10. swapped = true; 11. } 12. } 13. top = top - 1; 14. for(i = top; i > bottom; i = i - 1){ 15. if(list[i] < list[i - 1]){ 16. swap(list[i], list[i - 1]); 17. swapped = true; 18. } 19. } 20. bottom = bottom + 1; 21. } 22.} [1] http://en.wikipedia.org/wiki/cocktail_sort

7 - Ordenação pelo método de Shell Sort O algoritmo Shell Sort é uma extensão do Insertion Sort com 2 observações: * Insertion Sort é eficiente se a entrada está quase ordenada * Insertion Sort é ineficiente, no caso geral, pois move valores de uma posição por vez O algoritmo de Shell Sort é similar ao de Insertion Sort, porém trabalha utilizando passos mais largos conforme ordena os valores, e vai diminuindo o valor do passo gradualmente ate que este se torne 1. No final, o shell sort faz um insertion sort comum, porém o array de dados é garantidamente quase ordenado. Algoritmo em Pseudo-Código: 1. shellsort(int a[], int l, int r){ 2. int i, j, k, h, v; 3. int incs[16] = { 1391376, 463792, 198768, 86961, 33936, 4. 13776, 4592, 1968, 861, 336, 5. 112, 48, 21, 7, 3, 1 }; 6. for ( k = 0; k < 16; k++) 7. for (h = incs[k], i = l+h; i <= r; i++){ 8. v = a[i]; j = i; 9. while (j >= h && a[j-h] > v){ 10. a[j] = a[j-h]; 11. j -= h; 12. } 13. a[j] = v; 14. } 15. } [1] Sedgewick, R. 1996. Analysis of Shellsort and Related Algorithms. In Proceedings of the Fourth Annual European Symposium on Algorithms (September 25-27, 1996). J. Díaz and M. J. Serna, Eds. Lecture Notes In Computer Science, vol. 1136. Springer-Verlag, London, 1-11. [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts. [3] http://www.cs.princeton.edu/~rs/shell/ [4] http://en.wikipedia.org/wiki/shell_sort

8 - Ordenação pelo método de Merge Sort O merge sort, ou ordenação por mistura, é um exemplo de algoritmo de ordenação do tipo dividirpara-conquistar. Sua idéia básica é que é muito fácil criar uma sequência ordenada a partir de duas outras também ordenadas. Para isso, ele divide a sequência original em pares de dados, ordena-as; depois as agrupa em sequências de quatro elementos, e assim por diante, até ter toda a sequência dividida em apenas duas partes. Os três passos úteis dos algoritmos dividir-para-conquistar, ou divide and conquer, que se aplicam ao merge sort são: 1. Dividir: Dividir os dados em subsequências pequenas; 2. Conquistar: Classificar as duas metades recursivamente aplicando o merge sort; 3. Combinar: Juntar as duas metades em um único conjunto já classificado. Algoritmo em Pseudo-Código: 1. function mergesort(m) 2. var list left, right, result 3. if length(m) = 1 4. return m 5. else 6. var middle = length(m) / 2 7. for each x in m up to middle 8. add x to left 9. for each x in m after middle 10. add x to right 11. left = mergesort(left) 12. right = mergesort(right) 13. result = merge(left, right) 14. return result 15. function merge(left,right) 16. var list result 17. while length(left) > 0 and length(right) > 0 18. if first(left) = first(right) 19. append first(left) to result 20. left = rest(left) 21. else 22. append first(right) to result 23. right = rest(right) 24. if length(left) > 0 25. append rest(left) to result 26. if length(right) > 0 27. append rest(right) to result 28. return result [1] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts. [2] http://en.wikipedia.org/wiki/merge_sort [3] http://pt.wikipedia.org/wiki/merge_sort

9 - Ordenação pelo método de Comb Sort É um algoritmo de ordenação simplístico, projetado por Stephen Lacey e Richard Box. É uma melhoria de algoritmos como o bubble sort em velocidade. A idéia básica é eliminar valores pequenos perto do final da lista, nos algoritmos tipo bubble sort estes valores diminuem a performance enormemente. No Bubble Sort, quando dois elementos são comparados, eles sempre tem gap (distância de um para outro) de 1. A idéia básica do comb sort é que o gap pode ser mais de 1. Algoritmo em Pseudo-Código: 1. function combsort11(array input) 2. gap := input.size 3. loop until gap = 1 and swaps = 0 4. if gap > 1 5. gap := gap / 1.3 6. if gap = 10 or gap = 9 7. gap := 11 8. end if 9. end if 10. i := 0 11. swaps := 0 12. loop until i + gap >= array.size 13. if array[i] > array[i+gap] 14. swap(array[i], array[i+gap]) 15. swaps := swaps + 1 16. end if 17. i := i + 1 18. end loop 19. end loop 20. end function [1] http://en.wikipedia.org/wiki/comb_sort

10 - Ordenação pelo método Gnome sort O algoritmo de ordenação conhecido como Gnome Sort foi inventado por Dick Grune, e em suas palavras é o algoritmo de ordenação mais simples. É basicamente um algoritmo de Bubble Sort com uma particularidade: é bi-direcional. Pseudo-código do algoritmo: 1. gnomesort(a[]) { 2. i = 1 3. j = 2 4. while i = size - 1 5. if a[i-1] = a[i] 6. i = j 7. j = j + 1 8. else 9. swap a[i-1] and a[i] 10. i = i - 1 11. if i = 0 12. i = 1 13. } [1] http://www.cs.vu.nl/~dick/gnomesort.html [2] http://en.wikipedia.org/wiki/gnome_sort [3] http://pt.wikipedia.org/wiki/gnome_sort

11 - Ordenação de Strings pelo método Bubble Sort (Ordem alfabética) Utilize o método de ordenação Bubble Sort para ordenar dados do tipo string Assuma que: os strings são todos em letras minúsculas contém valores no intervalo [a-z] tem tamanho fixo de 3 elementos exemplos ('aba','zoi','fui','etc') lembrando que um string com o conteúdo 'abc' do tipo.asciiz contém 4 elementos 'abc0' onde 0(zero) é o elemento que indica o término de um string (null), e cada caracter possui 1 byte para comparar se uma letra é alfabeticamente maior ou menor que a outra utilize a tabela ASCII [3] Algoritmo em Pseudo-Código: #retorna 1 se str1<str2 #retorna 0 se str1=str2 #retorna 2 se str1>str2 1. comparestring(str1,str2){ 2. i=0 3. enquanto i<3 faça 4. se str1[i]<str2[i]{ 5. retorne 1 6. break 7. } 8. senao se str1[i]>str2[i]{ 9. retorne 2 10. break 11. } 12. i=i+1 13. fimenquanto 14. retorne 0 15.} BUBBLESORT (V[], n) 1 houvetroca <- verdade 2 enquanto houvetroca for verdade faça 3 houvetroca <- falso 4 para i de 1 até n-1 faça 5 se CompareString(V[i],V[i+1])=2 6 então troque V[i] e V[i + 1] de lugar e 7 houvetroca <- verdade [1] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts. [2] http://pt.wikipedia.org/wiki/bubble_sort [3] http://pt.wikipedia.org/wiki/tabela_ascii

12 - Pesquisa Binária em um Array Ordenado A pesquisa ou busca binária é um algoritmo de busca em vetores que requer acesso aleatório aos elementos do mesmo. Ela parte do pressuposto de que o vetor está ordenado, e realiza sucessivas divisões do espaço de busca comparando o elemento buscado (chave) com o elemento no meio do vetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso. Caso contrário, se o elemento do meio vier antes do elemento buscado, então a busca continua na metade posterior do vetor. E finalmente, se o elemento do meio vier depois da chave, a busca continua na metade anterior do vetor. A complexidade desse algoritmo é da ordem de log2 n, onde n é o tamanho do vetor de busca. Como resultado do seu programa, ele deve devolver o índice no array, que o elemento foi encontrado. Pseudo-código do algoritmo: 1. BUSCA-BINÁRIA (V[], inicio, fim, valor} 2. i recebe o índice no meio de inicio e fim 3. se V[i] é igual a valor 4. então devolva o índice i # encontrei valor 5. senão se V[i] vem antes de valor 6. então faça a BUSCA-BINÁRIA(V, i+1, fim, valor) 7. senão faça a BUSCA-BINÁRIA(V, inicio, i-1, valor) [1] http://pt.wikipedia.org/wiki/pesquisa_binária [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

13 - Criação e operações simples em Listas Ligadas Uma lista ligada é uma estrutura de dados linear e dinâmica. Ela é composta por células que apontam para o próximo elemento da lista. Para "ter" uma lista ligada, basta guardar seu primeiro elemento, e seu último elemento aponta para uma célula nula. O esquema a seguir representa uma lista ligada com 5 elementos: Nodo 1 --> Nodo 2 --> Nodo 3 --> Nodo 4 --> Nodo 5 --> (Nulo) considere a lista contendo elementos do tipo inteiro, como a palavra do MIPS é de 4 bytes, considere a estrutura Nodo como sendo 8 bytes. Um ponteiro para um nodo é NULO ou aponta para outro nodo. Os nodos serão armazenados na pilha na ordem como: o primeiro nodo da lista contém o número mais recentemente inserido,e o último nodo contém o primeiro número inserido. Neste trabalho serão implementados 2 métodos relacionados com listas:? inserenodo: insere um nodo na lista, este nodo contém o valor a ser inserido, e deve ser inserido no início? printlist: imprime a lista no console do SPIM Para facilitar na implementação considere o atributo head, este aponta para o primeiro nodo da lista. Algoritmo em Pseudo-Código: 1. Estrutura Nodo 2. ponteiro para Nodo next 3. int valor 1. Nodo* head; 2. inserenodo(int valor) { 3. Estrutura nodo *temp = malloc(sizeof(struct node)); 4. temp->next = head; 5. temp->value = value; 6. head = temp; 7. } 8. printlist { 9. Estrutura nodo *ptr; 10. ptr = head; 11. while (ptr!=0) { 12. printf(ptr->value); 13. ptr = ptr->next; 14. } 15.} [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

14 - Criação e operações simples em Filas As filas são estruturas baseadas no princípio FIFO (first in, first out), em que os elementos que foram inseridos no início são os primeiros a serem removidos. Uma fila possui duas funções básicas: ENQUEUE, que adiciona um elemento ao final da fila, e DEQUEUE, que remove o elemento no início da fila. A operação ENQUEUE sempre pode ser executada, uma vez que teoricamente uma fila não tem limite. A operação DEQUEUE só pode ser aplicado se a fila não estiver vazia, causando um erro de underflow ou fila vazia se esta operação for realizada nesta situação. Considere a fila contendo elementos do tipo inteiro, como a palavra do mips é de 4 bytes, considere a estrutura Element como sendo 8 bytes. Um ponteiro para um elemento é NULO ou aponta para outro elemento. Considere para meios de simplificação que só temos o método ENQUEUE, e outro método que imprime a fila no console. Algoritmo em Pseudo-Código: 1. Element 2. int value; 3. element* next; 4. Fila 5. int size; 6. element* head; 7. element* tail; 8. Enqueue(int ele){ 9. if(head==null){ 10. head=new element; 11. tail=head; 12. head->value=ele; 13. head->next=null; 14. }else{ 15. tail->next=new element; 16. tail->next->value=ele; 17. tail->next->next=null; 18. tail=tail->next; 19. } 20. size=size+1; 21.} 22. printqueueelements{ 23. element* curr2; 24. curr2= head; 25. while(curr2!=null){ 26. imprime(curr2->value); 27. curr2=curr2->next; 28. } 29. } [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.

15 - Multiplicação de matrizes Em matemática, o produto de duas matrizes é definido somente quando o número de colunas da primeira matriz é igual ao número de linhas da segunda matriz. Se A é uma matriz m-por-n e B é uma matriz n-por-p, então seu produto é uma matriz m-por-p definida como AB (ou por A B). O produto é dado por: para cada par i e j com 1 = i = m e 1 = j = p. Algoritmo em Pseudo-Código: 1. programa multiplica_matrizes; 2. matriz mat1, mat2, mat3; 3. inteiro linha, coluna, i, acumula; 4. "verifique se mat1 é compativel com mat2"; 5. para linha de 1 até "numero de linhas de mat1" faça 6. para coluna de 1 até "numero de colunas de mat2" faça 7. acumula=0; 8. para i de 1 até "numero de colunas de mat1" faça 9. acumula=acumula+mat1[linha][i]*mat2[i][coluna]; 10. fimpara; 11. mat3[linha][coluna]=acumula; 12. fimpara; 13. fimpara; 14. imprima mat3; 15. fim programa; [1] http://pt.wikipedia.org/wiki/produto_de_matrizes [2] http://pt.wikibooks.org/wiki/matem%c3%a1tica_elementar:_matrizes