ORDENAÇÃO POR INTERCALAÇÃO

Documentos relacionados
Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

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

BCC202 - Estrutura de Dados I

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

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

ALGORITMOS DE ORDENAÇÃO

Projeto e Análise de Algoritmos

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

Linguagem C: Ordenação

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

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

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

Algoritmos de Ordenação

ALGORITMOS em linguagem C

Análise e Complexidade de Algoritmos

void subdivide (LISTA_ENC *pl, LISTA_ENC *pl1, LISTA_ENC *pl2) { int cont, k=1; for (cont=tam(*pl)/2;cont;cont--) {

I. Correção de Algoritmos Não-Recursivos

Universidade da Madeira. 1. Recursão. 3. Busca. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2

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

BCC202 - Estrutura de Dados I

Quicksort [1] Quicksort [2]

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

ANÁLISE DE ALGORITMOS

Estruturas de Dados 2

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

Métodos de Classificação

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

Métodos de Ordenação Parte I

Paradigmas de Projetos de Algoritmos

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

AULA 13. Algoritmos p.526/582

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

Projeto de Algoritmos e Indução Matemática

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

Classificação por Intercalação

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

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

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

Projeto e Análise de Algoritmos

QUESTÕES DE PROVAS ANTIGAS

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Análise de complexidade

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

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

CORREÇÃO DE ALGORITMOS E

ESTRUTURAS DE DADOS E ALGORITMOS APRESENTAÇÃO DO CURSO E INTRODUÇÃO

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

Algoritmos de Classificação de Tabelas - Sorting

ORDENAÇÃO E BUSCA 1. MÉTODOS DE ORDENAÇÃO

Análise de algoritmos

Recursividade. Objetivos do módulo. O que é recursividade

QuickSort. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

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

Ordenação. Insertion Sort

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

6. Pesquisa e Ordenação

Aula prática 5. Funções Recursivas

Introdução Paradigmas

Algoritmos de Ordenação e Pesquisa. Marco Antonio Moreira de Carvalho Algoritmos e Estrutura de Dados

Projeto e Análise de Algoritmos

Técnicas de Projeto de Algoritmos

Trabalho Prático 1. Valor: 1,0 pontos (10% da nota total) Data de Entrega: 02/05/2010

Complexidade de Algoritmos

Algoritmos de Ordenação

DAINF - Departamento de Informática

Ordenação Externa. Profa. Graça Nunes

5. Algoritmos de Ordenação

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Quicksort Letícia Rodrigues Bueno

Ordenação em tempo linear

Mediana. Aula 09. Menor. i-ésimo menor elemento. Algoritmo de Seleção. -ésimo menor elemento. Mediana é o n+1. -ésimo menor ou o n+1

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

Quantidade de memória necessária

Métodos de Ordenação

Transcrição:

AULA 6 ORDENAÇÃO POR INTERCALAÇÃO Na aula 5 revimos os métodos de ordenação mais básicos, que são todos iterativos, simples e têm tempo de execução de pior caso proporcional a n 2, onde n é o tamanho da entrada. Métodos mais eficientes de ordenação são baseados em recursão, técnica introduzida na aula 1. Nesta aula, estudamos o método da ordenação por intercalação, conhecido como mergesort. A ordenação por intercalação, que veremos nesta aula, e a ordenação por separação, que veremos na aula 7, são métodos eficientes baseados na técnica recursiva chamada dividir para conquistar, onde quebramos o problema em vários subproblemas de menor tamanho que são similares ao problema original, resolvemos esses subproblemas recursivamente e então combinamos essas soluções para produzir uma solução para o problema original. Esa aula é baseada nolivro dep. Feofiloff[2] enolivro decormen et.al [1]. 6.1 Dividir para conquistar A técnica de dividir para conquistar é uma técnica geral de construção de algoritmos e programas, tendo a recursão como base, que envolve três passos em cada nível da recursão: Dividir o problema em um número de subproblemas; Conquistar os subproblemas solucionando-os recursivamente. No entanto, se os tamanhos dos subproblemas são suficientemente pequenos, resolva os subproblemas de uma maneira simples; Combinar as soluções dos subproblemas na solução do problema original. Comomencionamosnaaula4,oalgoritmodabuscabináriaéummétododebuscaqueusa a técnica de dividir para conquistar na solução do problema da busca. O método de ordenação por intercalação, que veremos nesta aula, e o método da ordenação por separação, que veremos na aula 7, também são algoritmos baseados nessa técnica. 6.2 Problema da intercalação Antes de apresentar o método da ordenação por intercalação, precisamos resolver um problema anterior, que auxilia esse método, chamado de problema da intercalação. O problema da intercalação pode ser descrito de forma mais geral como a seguir: dados dois conjuntos crescentes A e B, com m e n elementos respectivamente, obter um conjunto crescente C a partir 40

6.2 PROBLEMA DA INTERCALAÇÃO 41 de A e B. Variantes sutis desse problema geral podem ser descritas como no caso em que se permite ou não elementos iguais nos dois conjuntos de entrada, isto é, conjuntos de entrada A e B taisque A B ou A B =. O problema da intercalação que queremos resolver aqui é mais específico e pode ser assim descrito: dados dois vetores crescentes v[p..q 1] e v[q..r 1], rearranjar v[p..r 1] em ordem crescente. Isso significa que queremos de alguma forma intercalar os vetores v[0..q 1] e v[q..r 1]. Nesse caso, à primeira vista parece que os vetores de entrada podem ter elementos em comum. Entretanto, este não é o caso, já que estamos considerando o mesmo conjunto inicial de elementos armazenados no vetor v. Uma maneira fácil de resolver o problema da intercalação é usar um dos métodos de ordenação da aula 5 tendo como entrada o vetor v[p..r 1]. Essa solução, no entanto, tem consumo de tempo de pior caso proporcional ao quadrado do número de elementos do vetor e é ineficiente por desconsiderar as características dos vetores v[p..q 1] e v[q..r 1]. Umasoluçãomais eficiente,queusaum vetorauxiliar, émostradaaseguir. /* Recebe os vetores crescentes v[p..q-1] e v[q..r-1] e rearranja v[p..r-1] em ordem crescente */ void intercala(int p, int q, int r, int v[max]) { int i, j, k, w[max]; i = p; j = q; k = 0; while (i < q && j < r) { if (v[i] < v[j]) { w[k] = v[i]; i++; else { w[k] = v[j]; j++; while (i < q) { w[k] = v[i]; i++; while (j < r) { w[k] = v[j]; j++; for (i = p; i < r; i++) v[i] = w[i-p]; A função intercala tem tempo de execução de pior caso proporcional ao número de comparações entre os elementos do vetor, isto é, r p. Assim, podemos dizer que o consumo de tempo no pior caso da função intercala é proporcional ao número de elementos do vetor de entrada.

6.3 ORDENAÇÃO POR INTERCALAÇÃO 42 6.3 Ordenação por intercalação Com o problema da intercalação resolvido, podemos agora descrever uma função que implementa o método da ordenação por intercalação. Nesse método, dividimos ao meio um vetor v com r p elementos,ordenamosrecursivamente essasduasmetadesde v e entãoas intercalamos. Afunção mergesort aseguirérecursivaeabasedarecursãoocorrequando p r 1, quando não é necessário qualquer processamento. /* Recebe um vetor v[p..r-1] e o rearranja em ordem crescente */ void mergesort(int p, int r, int v[max]) { int q; if (p < r - 1) { q = (p + r) / 2; mergesort(p, q, v); mergesort(q, r, v); intercala(p, q, r, v); Como a expressão (p + q)/2 da função mergesort é do tipo inteiro, observe que seu resultadoé,naverdade,avaliado como p+q 2. Observe também que para ordenar um vetor v[0..n 1] basta chamar a função mergesort com os seguintes argumentos: mergesort(0, n, v); Vejamos um exemplo de execução da função mergesort na figura 6.1, para um vetor de entrada v[0..7] = {4,6,7,3,5,1,2,8 echamada mergesort(0, 8, v); Observe que as chamadas recursivas são realizadas até a linha divisória imaginária ilustrada na figura, quando p r 1. A partir desseponto,a cada volta deum nível de recursão, uma intercalação é realizada. No final, uma última intercalação é realizada e o vetor original torna-se então um vetor crescente com os mesmos elementos de entrada. Qual o desempenho da função mergesort quando queremos ordenar um vetor v[0..n 1]? Suponha, para efeito de simplificação, que n é uma potência de 2. Se esse não é o caso, podemos examinar duas potências de 2 consecutivas, justamente aquelas tais que 2 k 1 < n 2 k, para algum k 0. Observe então que o número de elementos do vetor é diminuído a aproximadamente metade a cada chamada da função mergesort. Ou seja, o número aproximado de chamadas éproporcionalalog 2 n. Naprimeiravez,oproblemaoriginaléreduzidoadoissubproblemasondeénecessárioordenarosvetores v[0.. n 2 1] e v[n 2..n 1]. Nasegundavez, cada

6.3 ORDENAÇÃO POR INTERCALAÇÃO 43 4 6 3 7 1 5 2 8 3 4 6 7 1 2 5 8 1 2 3 4 5 6 7 8 Figura 6.1: Exemplo de execução da ordenação por intercalação. um dos subproblemas são ainda divididos em mais dois subproblemas cada, gerando quatro subproblemasnototal,ondeénecessárioordenarosvetores v[0.. n 4 1], v[n 4..n 2 1], v[n 2..3n 4 1] e v[ 3n 4..n 1]. E assim por diante. Além disso, como já vimos, o tempo total que a função intercala gastaéproporcional ao número deelementosdovetor v, isto é, r p. Portanto,a função mergesort consometempoproporcionalan log 2 n. Exercícios 6.1 Simule detalhadamente a execução da função mergesort sobre o vetor de entrada v[0..7] = {3,41,52,26,38,57, 9, 49. 6.2 A função intercala estácorretanoscasosextremos p = q e q = r? 6.3 Um algoritmo de intercalação é estável se não altera a posição relativa dos elementos que têm um mesmo valor. Por exemplo, se o vetor tiver dois elementos de valor 222, um algoritmo de intercalação estável manterá o primeiro 222 antes do segundo. A função

6.3 ORDENAÇÃO POR INTERCALAÇÃO 44 intercala é estável? Se a comparação v[i] < v[j] for trocada por v[i] <= v[j] a função fica estável? 6.4 O que acontece se trocarmos (p + r)/2 por (p + r - 1)/2 no código da função mergesort? Que acontece se trocarmos (p + r)/2 por (p + r + 1)/2? 6.5 Escreva uma versão da ordenação por intercalação que rearranje um vetor v[p..r 1] em ordem decrescente. 6.6 Escrevaumafunçãoeficientequerecebaumconjunto S de nnúmerosreaiseumnúmero real x edetermineseexisteum par deelementosem S cuja somaéexatamente X. 6.7 Agora que você aprendeu o método da ordenação por intercalação, o problema a seguir, quejá vimos naaula 2, exercício 2.10,fica bemmais fácil deserresolvido. Seja A um vetorde nnúmeros inteirosdistintos. Se i < j e A[i] > A[j] então o par (i,j) é chamado uma inversão de A. (a) Listeas cinco inversõesdovetor {2,3,8,6,1. (b) Qual vetor com elementos do conjunto {1,2,...,n tem o maior número de inversões? Quantas são? (c) Qual a relação entreotempode execução daordenação por inserção e o número de inversões em um vetor de entrada? Justifique sua resposta. (d) Modificando a ordenação por intercalação, escreva uma função eficiente, com tempo de execução O(n log n), que determine o número de inversões em uma permutação de n elementos. 6.8 Escreva um programa para comparar experimentalmente o desempenho da função mergesort com o das funções trocas_sucessivas, selecao e insercao da aula 5. Use um vetor com números(pseudo-)aleatórios para fazer os testes. 6.9 Veja animações dos métodos de ordenação que já vimos nas seguintes páginas: Sort Animation de R. Mohammadi; Sorting Algorithms de J. Harrison; Sorting Algorithms de P. Morin; Sorting Algorithms Animations de D. R. Martin.