Universidade Federal do ABC Disciplina: BC1424 - Algoritmos e Estruturas de Dados I Professor: Jesús P. Mena-Chalco Avaliação: Prova 02 Turma: Noturno Data: 03/05/2016 Nome completo: RA: Instruções para a prova (leia antes de começar): 1) A prova tem a duração de 1h50min. 2) Utilize a linguagem C para todas as questões (não utilize pseudocódigo). 1. Selection Sort é um algoritmo de ordenação baseado em se passar sempre o menor valor do vetor para a primeira posição (ou o maior dependendo da ordem requerida), depois o de segundo menor valor para a segunda posição, e assim é feito sucessivamente com os (n-1) elementos restantes, até os últimos dois elementos. void SelectionSort ( int v[], int n ) { int i, j, iMin, aux; for (i=0; i<n­1; i=i+1) { iMin = i; for (j=i+1; j<n; j=j+1) { if (v[iMin]>v[j]) iMin = j; } if (iMin!=i) { aux = v[iMin]; v[iMin] = v[i]; v[i] = aux; } } } Implemente o Selection Sort usando uma função recursiva que receba um vetor e o seu tamanho, porém inverta a ideia, ao invés de passar o menor valor para a primeira posição, depois o segundo maior para a segunda posição e assim por diante; pense de forma a passar o maior valor para a última posição, depois o segundo maior para a penúltima posição e assim sucessivamente para os (n-1) elementos. Assinatura: void selectonSortRec( int v[], int n ) 2. O algoritmo de ordenação Merge Sort é estável se a função de Intercala for estável. (a) A função a seguir é estável? Se sim, justifique sua afirmação. Se não, apresente a modificação para torná-la estável. Justifique sua resposta. (b) Qual é o número de comparações da linha 4 no melhor e no pior caso? 1. void Intercala ( int p, int q, int r, int v[] ) { 2. int i=p, j=q, k, w[r­p]; 3. for (k=0; i<q && j<r; k=k+1) { 4. if (v[i]<v[j]) { 5. w[k] = v[i]; 6. i = i+1; 7. } 8. else { 9. w[k] = v[j]; 10. j = j+1; 11. } 12. } 13. while (i<q) { 14. w[k] = v[i]; 15. k = k+1; 16. i = i+1; 17. } 18. while (j<r) { 19. w[k] = v[j]; 20. k = k+1; 21. j = j+1; 22. } 23. for(i=p; i<r; i=i+1) 24. v[i] = w[i­p]; 25.} 3. Considere o algoritmo de ordenação Quick Sort: (a) Qual é a altura que a pilha de recursão pode atingir? Indique em termos de p e r. (b) Apresente uma variante do Quick Sort de tal forma que a pilha de recursão tenha altura proporcional a O(log(n)), onde n é o número de elementos no vetor. Justifique sua resposta. void QuickSort(int A[], int p, int r) { if (p<r) { int q = Particione(A, p, r); QuickSort(A, p, q­1); QuickSort(A, q+1, r); } } 4. Quais posições de um vetor organizado como um Max-Heap de elementos distintos poderiam ser ocupadas pelo terceiro maior elemento? E o terceiro menor elemento? Justifique. 5. Use a função HeapSort para ordenar o vetor [16, 15, 14, 13, 12, 11, 10]. Apresente a estrutura do Max-Heap constituído a cada iteração do algoritmo. (4 pontos) 6. Descreva brevemente o algoritmo de ordenação hibrido visto em laboratório QuickInsertionSort. (a) Qual a vantagem de usar primeiro o Quick Sort e depois o Insertion Sort? (b) Qual a complexidade do algoritmo híbrido no pior caso? 7. Mostre a árvore final após inserir as chaves a seguir em uma árvore binária de busca, inicialmente vazia: F, S, K, C, L, H, T, W, M, P, A, X, D, B. (4 pontos) Considere a ordem do alfabeto: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 8. O percurso de uma árvore binária de busca em ordem r-e-d resultou na impressão da sequência M, B, A, E, C, D, R, P, N, O, W, e o percurso da mesma árvore em ordem e-r-d resultou em A, B, C, D, E, M, N, O, P, R, W. Construa uma árvore que satisfaça esses percursos. (5 pontos) 9. Dadas a estrutura de uma árvore binária de busca, escreva uma função recursiva que receba a raiz de uma árvore binária de busca e imprima os valores de suas chaves em ordem decrescente. struct cel { int conteudo; struct cel *pai; struct cel *esq; struct cel *dir; }; typedef struct cel no; Assinatura: void imprimir( no * r ) 10. Faça uma “boa pergunta” de um tópico que domine e esteja relacionada com a disciplina. Apresente uma resposta detalhada que prove seus conhecimentos sólidos na disciplina.