Você está na página 1de 11

Mdulo 2

Introduo Programao II

Lio 6
Algoritmos de Ordenao

Verso 1.0 - Mar/2007

JEDITM

Autor Rebecca Ong Equipe Joyce Avestro Florence Balagtas Rommel Feria Rebecca Ong John Paul Petines Sun Microsystems Sun Philippines

Necessidades para os Exerccios

Sistemas Operacionais Suportados NetBeans IDE 5.5 para os seguintes sistemas operacionais: Microsoft Windows XP Profissional SP2 ou superior Mac OS X 10.4.5 ou superior Red Hat Fedora Core 3 Solaris 10 Operating System (SPARC e x86/x64 Platform Edition) NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas: Microsoft Windows 2000 Profissional SP4 Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e x86/x64 Platform Edition) Vrias outras distribuies Linux Configurao Mnima de Hardware Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 500 MHz Intel Pentium III workstation ou equivalente 500 MHz Intel Pentium III workstation ou equivalente UltraSPARC II 450 MHz AMD Opteron 100 Srie 1.8 GHz PowerPC G4 Memria 512 MB 512 MB 512 MB 512 MB 512 MB HD Livre 850 MB 450 MB 450 MB 450 MB 450 MB

Configurao Recomendada de Hardware Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 1.4 GHz Intel Pentium III workstation ou equivalente 1.4 GHz Intel Pentium III workstation ou equivalente UltraSPARC IIIi 1 GHz AMD Opteron 100 Series 1.8 GHz PowerPC G5 Memria 1 GB 1 GB 1 GB 1 GB 1 GB HD Livre 1 GB 850 MB 850 MB 850 MB 850 MB

Requerimentos de Software NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar, e executar aplicaes escritas em linguagem Java. Sun Java System Application Server Platform Edition 9. Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para sua plataforma em http://java.sun.com/j2se/1.5.0/download.html Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode ser obtida diretamente da Apple's Developer Connection, no endereo: http://developer.apple.com/java ( necessrio registrar o download da JDK). Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html

Introduo Programao II

JEDITM

Colaboradores que auxiliaram no processo de traduo e reviso


Alexandre Mori Alexis da Rocha Silva Aline Sabbatini da Silva Alves Allan Wojcik da Silva Andr Luiz Moreira Andro Mrcio Correa Louredo Antoniele de Assis Lima Antonio Jose R. Alves Ramos Aurlio Soares Neto Bruno da Silva Bonfim Bruno dos Santos Miranda Bruno Ferreira Rodrigues Carlos Alberto Vitorino de Almeida Carlos Alexandre de Sene Carlos Andr Noronha de Sousa Carlos Eduardo Veras Neves Cleber Ferreira de Sousa Cleyton Artur Soares Urani Cristiano Borges Ferreira Cristiano de Siqueira Pires Derlon Vandri Aliendres Fabiano Eduardo de Oliveira Fbio Bombonato Fernando Antonio Mota Trinta Flvio Alves Gomes Francisco das Chagas Francisco Marcio da Silva Gilson Moreno Costa Givailson de Souza Neves Gustavo Henrique Castellano Hebert Julio Gonalves de Paula Heraldo Conceio Domingues Hugo Leonardo Malheiros Ferreira Ivan Nascimento Fonseca Jacqueline Susann Barbosa Jader de Carvalho Belarmino Joo Aurlio Telles da Rocha Joo Paulo Cirino Silva de Novais Joo Vianney Barrozo Costa Jos Augusto Martins Nieviadonski Jos Leonardo Borges de Melo Jos Ricardo Carneiro Kleberth Bezerra G. dos Santos Lafaiete de S Guimares Leandro Silva de Morais Leonardo Leopoldo do Nascimento Leonardo Pereira dos Santos Leonardo Rangel de Melo Filardi Lucas Mauricio Castro e Martins Luciana Rocha de Oliveira Lus Carlos Andr Lus Octvio Jorge V. Lima Luiz Fernandes de Oliveira Junior Luiz Victor de Andrade Lima Manoel Cotts de Queiroz Marcello Sandi Pinheiro Marcelo Ortolan Pazzetto Marco Aurlio Martins Bessa Marcos Vinicius de Toledo Maria Carolina Ferreira da Silva Massimiliano Giroldi Mauricio Azevedo Gamarra Mauricio da Silva Marinho Mauro Cardoso Mortoni Mauro Regis de Sousa Lima Namor de S e Silva Nres Chaves Rebouas Nolyanne Peixoto Brasil Vieira Paulo Afonso Corra Paulo Jos Lemos Costa Paulo Oliveira Sampaio Reis Pedro Antonio Pereira Miranda Pedro Henrique Pereira de Andrade Renato Alves Flix Renato Barbosa da Silva Reyderson Magela dos Reis Ricardo Ferreira Rodrigues Ricardo Ulrich Bomfim Robson de Oliveira Cunha Rodrigo Pereira Machado Rodrigo Rosa Miranda Corra Rodrigo Vaez Ronie Dotzlaw Rosely Moreira de Jesus Seire Pareja Sergio Pomerancblum Silvio Sznifer Suzana da Costa Oliveira Tsio Vasconcelos da Silveira Thiago Magela Rodrigues Dias Tiago Gimenez Ribeiro Vanderlei Carvalho Rodrigues Pinto Vanessa dos Santos Almeida Vast Mendes da Silva Rocha Wagner Eliezer Roncoletta

Auxiliadores especiais
Reviso Geral do texto para os seguintes Pases:
Brasil Tiago Flach Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro

Coordenao do DFJUG
Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso, disponibilizao dos materiais e insero de novos mdulos Regina Mariani - Coordenadora responsvel pela parte jurdica Rodrigo Nunes - Coordenador responsvel pela parte multimdia Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)

Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM Rommel Feria Criador da Iniciativa JEDITM

Introduo Programao II

JEDITM

1. Objetivos
Ordenao tem a tarefa de organizar elementos em uma ordem particular, e isto implementado em uma variedade de aplicaes. Considerando uma aplicao bancria, a qual exibe a lista de contas de clientes ativos, por exemplo. A maioria dos usurios deste sistema provavelmente preferem ter a lista em uma ordem crescente, por convenincia. Nesta lio veremos vrios algoritmos de ordenao foram inventados porque essa tarefa fundamental e freqentemente utilizada. Por estas razes, examinar os algoritmos existentes ser muito benfico. Ao final desta lio, o estudante ser capaz de: Explicar os algoritmos utilizados em ordenao por insero, ordenao por seleo, Merge Sort e Quick Sort Implementar seu prprio algoritmo utilizando essas tcnicas

Introduo Programao II

JEDITM

2. Ordenao por insero


Um dos mais simples algoritmos desenvolvidos o de ordenao por insero. A idia de algoritmo absolutamente intuitiva. A seguinte sinopse descreve como a ordenao por insero funciona para ordenar uma srie de cartas. Desejamos ordenar uma srie de cartas do menor at o maior da categoria. Todas as cartas esto inicialmente colocadas em uma tabela e a chamaremos de 1 tabela, seguindo estritamente a ordem da esquerda para a direita, do topo ao fundo. Ns temos outra tabela, chamada de 2 tabela, onde as cartas sero posicionadas. Escolha a primeira carta disponvel da esquerda na 1 tabela, e que esteja no topo, e coloque esta carta no local adequado (ou seja, ordenado) posicionando na 2 tabela. Escolha a prxima carta disponvel da 1 tabela e compare-a com as cartas da 2 tabela e coloque-a na posio adequada. O processo continua at que todas as cartas sejam colocadas na 2 tabela. O algoritmo de ordenao por insero basicamente divide os elementos a serem ordenados em dois grupos: os no ordenados (semelhante 1 tabela) e os ordenados (semelhante 2 tabela). O primeiro elemento disponvel selecionado dentre os no ordenados do array e este corretamente posicionado na parte ordenada do array. Esse passo repetido at que no hajam mais elementos esquerda, na parte no ordenada do array.

2.1. O algoritmo
public void insertionSort(Object array[], int startIdx, int endIdx) { for (int i = startIdx; i < endIdx; i++) { int k = i; for (int j = i + 1; j < endIdx; j++) { if (((Comparable) array[k]).compareTo(array[j])>0) { k = j; } } swap(array[i], array[k]); } }

2.2. Um exemplo
Dados Manga Ma Pssego Laranja Banana 1 passo Manga Ma Pssego Laranja Banana 2 passo Ma Manga Pssego Laranja Banana 3 passo Laranja Ma Manga Pssego Banana 4 passo Banana Laranja Ma Manga Pssego

Figura 1: Exemplo de ordenao por insero

Introduo Programao II

JEDITM

3. Ordenao por seleo


Ao se criar um primeiro algoritmo de ordenao, provavelmente foi criado algo parecido com o algoritmo de ordenao por insero. Como o algoritmo de ordenao por insero, esse algoritmo muito intuitivo e fcil de implementar. Novamente vamos observar como este algoritmo funciona em uma escala de mao de cartas. Considere que as cartas sero organizadas em ordem crescente. Inicialmente, as cartas esto organizadas linearmente na tabela da esquerda para a direita e do topo at embaixo. Confira o nvel de cada carta e escolha a carta com o menor nvel. Troque a posio dessa carta com a da primeira carta, a que est no topo da esquerda. Depois, localize a carta com o menor nvel entre as cartas restantes, excluindo a primeira carta escolhida. Troque novamente a carta selecionada com a carta na segunda posio. Repita esse mesmo passo at que, da segunda ltima posio na tabela sejam analisadas e possivelmente trocadas por cartas com o menor valor. A idia principal por trs do algoritmo de ordenao por seleo selecionar o elemento com o menor valor e ento trocar o elemento selecionado com o elemento na i posio. O valor de i inicia com 1 at n, onde n o nmero total de elementos menos 1.

3.1. O algoritmo
public void selectionSort(Object array[], int startIdx, int endIdx) { int min; for (int i = startIdx; i < endIdx; i++) { min = i; for (int j = i + 1; j < endIdx; j++) { if (((Comparable) array[min]).compareTo(array[j])>0) { min = j; } } swap(array[min], array[i]); } }

3.2. Um exemplo
Dados Maricar Vanessa Margaux Hannah Rowena 1 passo Hannah Vanessa Margaux Maricar Rowena 2 passo Hannah Margaux Vanessa Maricar Rowena 3 passo Hannah Margaux Maricar Vanessa Rowena 4 passo Hannah Margaux Maricar Rowena Vanessa

Figura 2: Exemplo de ordenao por seleo

Introduo Programao II

JEDITM

4. Merge Sort
Antes de examinar o algoritmo Merge Sort, vamos primeiramente dar uma rpida olhada no paradigma do dividir-e-conquistar para que melhor se compreenda o Merge Sort.

4.1. Paradigma do dividir-e-conquistar


Vrios algoritmos utilizam a repetio (recursividade) para solucionar um determinado problema. O problema original dividido em subproblemas, ento as solues dos subproblemas conduzem a soluo do poblema principal. Esse tipo de algoritmo tipicamente seguem o paradigma do dividir-e-conquistar. Em cada nvel de recursividade, o paradigma consiste de trs passos. 1.Dividir Dividir o problema principal em subproblemas. 2.Conquistar Conquistar os subproblemas resolvendo-os atravs da recursividade. No caso em que os subproblemas so simples e pequenos o suficiente, resolver de maneira direta. 3.Combinar Unir as solues dos subproblemas, direcionando soluo do problema principal.

4.2. Entendendo Merge Sort


Como mencionado anteriormente, Merge Sort utiliza a tcnica do dividir-e-conquistar. Dessa foma, a descrio deste algoritmo seguida como exemplo depois dos trs passos do paradigma do dividir-e-conquistar. Aqui est como o Merge Sort funciona. 1.Dividir Dividir a sequncia dos elementos dados em duas partes. 2.Conquistar Conquistar cada parte de modo repetitivo, chamando o mtodo Merge Sort. 3.Combinar Combinar ou fundir as duas partes recursivamente para apresentar a seqncia ordenada. A repetio acaba quando o objetivo bsico alcanado. Este o caso onde a parte a ser ordenada possui exatamente um elemento. J que apenas um elemento seja separado para ser ordenado, essa parte j est organizada na sua prpria sequncia.

4.3. O algoritmo
void mergeSort(Object array[], int startIdx, int endIdx) { if (array.length != 1) { mergeSort(leftArr, startIdx, midIdx); mergeSort(rightArr, midIdx+1, endIdx); combine(leftArr, rightArr); } }
Introduo Programao II 7

JEDITM

4.4. Um exemplo
Dados:

7 2 5 6
Dividir o array de dados em dois: ArrayEsq ArrayDir

7 2

5 6

Dividir o ArrayEsq em dois: ArrayEsq ArrayDir

7
Combinar

2 7
Dividir ArrDir em dois: ArrayEsq ArrayDir

5
Combinar

5 6
Combinar ArrayEsq e ArrayDir.

2 5 6 7
Figura 3: Exemplo de Merge sort

Introduo Programao II

JEDITM

5. Quick Sort
Quick Sort foi criado por C.A.R. Hoare. Como o Merge Sort, este algoritmo baseado no paradigma do dividir-e-conquistar. Mas ao invs de possuir as trs fases, ele envolve apenas as seguintes fases: 1.Dividir Separao dos arrays em dois subarrays A[p...q-1] e A[q+1...r] onde cada elemento em A[p...q-1] menor ou igual a A[q] e cada elemento em A[q+1...r] maior ou igual a A[q]. A[q] chamado de eixo. Clculo de q parte do processo de separao. 2.Conquistar Ordenar os subarrays pela recursividade, chamado de mtodo quickSort. No existe a fase de "Combinar" pois os subarrays so ordenados localmente.

5.1. O algoritmo
void quickSort(Object array[], int leftIdx, int rightIdx) { int pivotIdx; if (rightIdx > leftIdx) { pivotIdx = partition(array, leftIdx, rightIdx); quickSort(array, leftIdx, pivotIdx-1); quickSort(array, pivotIdx+1, rightIdx); } }

5.2. Um exemplo
Array dado: 3 1 4 1 5 9 2 6 5 3 5 8

Escolher o primeiro elemento para ser o eixo = 3. 3 1 4 1 5 9 2 6 5 3 5 8

Inicializar a esquerda com o ponteiro no segundo elemento, e a direita com o ponteiro no ltimo elemento. Esq. 3 1 4 1 5 9 2 6 5 3 5 Dir. 8

Mover o ponteiro da esquerda na direo da direita at ser localizado um valor maior do que o do eixo. Mover o ponteiro direito na direo esquerda at ser localizado um valor menor do que o eixo. Esq. Dir. 3 1 4 1 5 9 2 6 5 3 5 8

Trocar os elementos referidos com os ponteiros esquerdo e direito.

Introduo Programao II

JEDITM

Esq. 3 1 3 1 5 9 2 6 5

Dir. 4 5 8

Mover os ponteiros direito e esquerdo novamente. Esq. 3 1 3 1 5 9 Dir. 2 6 5 4 5 8

Trocar os elementos. Esq. 3 1 3 1 2 9 Dir. 5 6 5 4 5 8

Mover os ponteiros esquerdos e direitos novamente. Dir. 3 1 3 1 2 Esq. 9 5 6 5 4 5 8

Observe que os ponteiros da esquerda e direita se cruzaram e o direito < esquerdo. Neste caso, trocar o eixo pelo valor do ponteiro direito. piv 2 1 3 1 3 9 5 6 5 4 5 8

Figura 4: Exemplo de Quick Sort

A caminhada do eixo agora est completa. Ordenao de arrays por recursividade em cada lado, utilizando o eixo.

Introduo Programao II

10

JEDITM

Parceiros que tornaram JEDITM possvel

Instituto CTS Patrocinador do DFJUG. Sun Microsystems Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas. Java Research and Development Center da Universidade das Filipinas Criador da Iniciativa JEDITM. DFJUG Detentor dos direitos do JEDITM nos pases de lngua portuguesa. Banco do Brasil Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM. Politec Suporte e apoio financeiro e logstico a todo o processo. Borland Apoio internacional para que possamos alcanar os outros pases de lngua portuguesa. Instituto Gaudium/CNBB Fornecimento da sua infra-estrutura de hardware de seus servidores para que os milhares de alunos possam acessar o material do curso simultaneamente.

Introduo Programao II

11

Você também pode gostar