Universidade Tecnológica Federal do Paraná (UTFPR) Departamento Acadêmico de Informática (DAINF) Computação II Professor: Alex Kutzke ([email protected]) Especificação do Segundo Trabalho Prático Análise de Algoritmos de Ordenação 1 Sumário e Objetivo O trabalho aqui especificado visa a implementação de seis algoritmos de ordenação e a produção de uma análise crı́tica com relação ao desempenho destes. O trabalho deve ser implementado inteiramente em Linguagem C. Um relatório no formato PDF deve ser enviado juntamente ao(s) código(s) fonte do programa. A entrega deve ser realizada pelo site da disciplina até a seguinte data: 06/12/2015 às 23:59h. O trabalho deve ser realizado em grupos de até 3 alunos. As próximas Seções descrevem a especificação do trabalho em detalhes. 1 2 Detalhes de implementação O objetivo deste trabalho é implementar e comparar o desempenho dos seguintes algoritmos de ordenação: • Bubble-sort; • Selection-sort; • Insertion-sort; • Merge-sort; • Heap-sort; • Quick-sort. Para tanto, cada grupo deve implementar um programa em linguagem C capaz de executar os algoritmos acima para um conjunto de N números inteiros. Dois tipos de entrada são possı́veis: por teclado e geração automática de números. 2.1 Parâmetros na linha de comando O programa implementado pode receber três parâmetros pela linha de comando (um obrigatório e dois opcionais): $ sorting <alg> [input] [print] O primeiro parâmetro, alg, é obrigatório e indica qual algoritmo deve ser utilizado para a ordenação dos dados de entrada. Os valores possı́veis para esse parâmetro são: 2 bs : Bubble-sort; ss : Selection-sort; is : Insertion-sort; ms : Merge-sort; hs : Heap-sort; qs : Quick-sort; O segundo parâmetro é opcional e indica se os números a serem ordenados devem ser gerados de maneira automática. Na ausência desse parâmetro, o programa deverá ler os números a partir do teclado. Os valores possı́veis para esse parâmetro são: order : gera automaticamente conjuntos de elementos em ordem crescente; reverse : gera automaticamente conjuntos de elementos em ordem decrescente; random : gera automaticamente conjuntos de elementos aleatórios. O último parâmetro, também opcional, indica se o programa deve exibir os elementos ordenados. O único valor possı́vel para esse parâmetro é a palavra “print”. Alguns exemplos de execução: $ sorting bs print $ sorting hs $ sorting qs random print # ordena e imprime N números lidos do teclado com o algoritmo bubble-sort # ordena N números lidos do teclado com o algoritmo heap-sort # ordena e imprime números aleatórios com o 3 $ sorting is order 2.2 algoritmo quick-sort # ordena um conjunto de números já em ordem crescente com o algoritmo insertion-sort Entrada e saı́da Como descrito anteriormente, o programa a ser implementado terá duas opções de entrada: teclado ou números gerados automaticamente. Cada tipo de entrada irá produzir um comportamento de saı́da diferente. Para o primeiro tipo, leitura através do teclado, o programa deverá ler um número inteiro (do tipo long) N , que representará a quantidade de elementos que se deseja ordenar. Na sequência, o programa deverá ler N números inteiros (também do tipo long). A saı́da para este caso será a seguinte: [Lista dos números ordenados apenas se o par^ ametro print foi passado] N Número de trocas Número de comparaç~ oes Tempo Ou seja, se o parâmetro print foi passado, deve-se exibir a lista dos números ordenados em ordem crescente. Na sequência, devem ser expostos os seguintes dados: número de elementos ordenados, quantidade de trocas e comparações executados pelo algoritmo de ordenação e, por fim, o tempo em milisegundos que o algoritmo levou para ordenar o conjunto de elementos. Por exemplo: $ sorting ss print 5 5 4 3 2 1 1 2 3 4 5 # entrada # entrada # saı́da 4 5 4 10 $ sorting ss 5 5 4 3 2 1 5 4 10 XYZ # saı́da XYZ # entrada # entrada # saı́da O comportamento do programa quando o parâmetro para geração automática é passado pela linha de comando deve ser diferente. Nesse caso, o programa deve realizar uma sequencia de ordenações para um conjunto determinado de tamanhos de entrada. Esse conjunto é o seguinte: N ∈ {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500, 8000, 8500, 9000, 9500, 10000, 100000, 1000000, 10000000}. Em outras palavras, o programa deverá gerar e ordenar 40 conjuntos diferentes de elementos (um de cada vez, iniciando pelo menor valor de N ), seguindo as regras definidas pelo parâmetro passado, e exibir a saı́da para cada um dos casos. Por exemplo: $ sorting ss order 10 N_COMPS N_TROCAS TEMPO 20 N_COMPS N_TROCAS TEMPO 30 N_COMPS N_TROCAS TEMPO ... 10000000 N_COMPS N_TROCAS 2.3 TEMPO Implementação dos algoritmos de ordenação Cada um dos algoritmos deve ser implementado como uma função em linguagem C, seguindo o seguinte protótipo: 5 void nome_alg_ord(long * v, long n, long * comps, long * trocas) O número de trocas e de comparações executadas pelo algoritmo deve ser retornado ao programa através dos parâmetros comps e trocas, passados por referência. 3 Relatório Além do código-fonte do programa implementado, cada grupo produzirá um relatório comparando o desempenho dos algoritmos. Este relatório deve conter uma análise crı́tica, a qual apresenta e justifica o melhor e o pior caso de cada algoritmo, bem como, a descrição de suas complexidades. O relatório deve, também, conter gráficos que relacionem o número de elementos (e sua forma: ordenado crescentemente, ordenado decrescentemente ou aleatório) e o desempenho de cada algoritmo (comparações, trocas e/ou tempo). Por exemplo, a Figura 1 apresenta a comparação do tempo de processamento utilizado pelos algoritmos bubble-sort, selection-sort e insertionsort para diferentes tamanhos de entrada. 4 Entrega O trabalho deve ser entregue através do site da disciplina: http://http://alex.kutzke.com.br/courses/4 Na opção “Atividades”, encontre a atividade “Trabalho 2” e preencha o formulário para a submissão do trabalho. 6 600 Bubble Selection Insertion 500 400 300 200 100 0 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 Figura 1: Tempo de processamento utilizado pelos algoritmos bubble-sort, selection-sort e insertion-sort para diferentes tamanhos de entrada. Cada grupo pode realizar quantas submissões forem necessárias, pois apenas a mais recente será considerada. Qualquer dúvida entre em contato através do email: [email protected]. utfpr.edu.br 7