Você está na página 1de 36

Faculdade de Tecnologia da Amaznia Curso Anlise e Desenvolvimento de Sistemas

Estrutura de Dados Aplicada


Aula7: ordenao de vetores Ano/semestre: 2009.1

Yomara Pires yopires@yahoo.com.br

Tpicos
Introduo Ordenao por mtodo Bolha (Bubble Sort) Ordenao por insero Ordenao por seleo

Introduo
O conjunto de aplicaes possveis para vetores enorme, mas dois so comuns, importantes e necessrios. Pesquisa e Classificao. A pesquisa consiste na verificao da existncia de um valor dentro de um conjunto de dados (vetor). Seqencial ou Binria.

Introduo
A classificao consiste em colocar os elementos do vetor em uma determinada ordem, seguindo um critrio necessrio para cada problema. Ordem alfabtica (para dados literais) Crescente ou decrescente (dados numricos).

Introduo
Existem vrios mtodos de classificao classificao por seleo e troca ou simplesmente Mtodo Bolha (Bubble Sort) classificao por de insero (Insertion Sort) classificao por seleo (Selection Sort)

Ordenao por mtodo Bolha (Bubble Sort)


O bubble sort, ou ordenao por flutuao (literalmente "por bolha"), um algoritmo de ordenao dos mais simples. A idia percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topo o menor elemento da seqncia. Os valores maiores afundam para o fundo (fim do vetor) Essa movimentao lembra a forma como as bolhas em um tanque de gua procuram seu prprio nvel, e disso vem o nome do algoritmo.

Ordenao por mtodo Bolha


A tcnica consiste em seqencialmente cada um dos elementos do vetor, comparando os elementos vizinhos entre si. Caso estejam fora de ordem, os mesmo trocam de posio (swap). Procede-se assim at o final do vetor. Na primeira varredura o ltimo elemento do vetor estar no seu devido lugar (caso a ordenao seja crescente, ele o maior de todos).

Ordenao por mtodo Bolha (Bubble Sort)


A segunda varredura anloga primeira e vai at o penltimo elemento. O processo repetido at que tenham sido feitas tantas varreduras quanto o nmero de elementos a serem classificados menos um. Ao final o vetor estar classificado segundo oprocesso escolhido.

Ordenao por mtodo Bolha (Bubble Sort)


Exemplo: Imaginemos que voc possui um vetor com os seguintes nmeros inteiros [5, 1, 4, 2, 8], e deseja orden-lo de modo crescente utilizando o algoritmo bubble sort. A cada vez que o vetor percorrido pelo algoritmo, os elementos em negrito so comparados:

Ordenao por mtodo Bolha (Bubble Sort)


Primeira Vez: O algoritmo compara os dois primeiros elementos e realiza o swap entre eles.
(5 (1 (1 (1 1 5 4 4 4 4 5 2 2 2 2 5 8) 8) 8) 8) \para \para \para \para (1 (1 (1 (1 5 4 4 4 4 5 2 2 2 2 5 5 8) 8) 8) 8)

Ordenao por mtodo Bolha (Bubble Sort)


Segunda vez: ( 1 4 2 5 8 ) \para ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) \para ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) \para ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) \para ( 1 2 4 5 8 ) Nesse momento o vetor est completamente ordenado, entretando o algoritmo no sabe disso. Ele necessita percorrer mais uma vez o vetor sem realizar um swap para compreender isso. Terceira vez: ( 1 2 4 5 8 ) \para ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) \para ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) \para ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) \para ( 1 2 4 5 8 ) Finalmente o vetor est ordenado e o algoritmo pode encerrar sua execuo.

Ordenao por mtodo Bolha (Bubble Sort)


O algoritmo pode ser descrito em pseudocdigo como segue abaixo.
Onde:
V um VETOR de elementos que podem ser comparados n o tamanho desse vector.

Ordenao por mtodo Bolha (Bubble Sort)


1. 2. 3. 4. 5. 6. 7.

BUBBLESORT (V[], n) houveTroca <- verdade //uma varivel de controle enquanto houveTroca for verdade faa: houveTroca <- falso para i de 1 at n-1 faa: se V[i] vem depois de V[i + 1] ento troque V[i] e V[i + 1] de lugar e houveTroca <- verdade

Ordenao por mtodo Bolha (Bubble Sort)


Java

Ordenao por mtodo Bolha

Ordenao por mtodo Bolha (Bubble Sort)


Outro exemplo pseudocodigo

Ordenao por mtodo Bolha (Bubble Sort)


Vantagens
Fcil de programar

Desvantagem
Execuo lenta
No melhor caso, o algoritmo executa n2 / 2 operaes relevantes, onde n representa o nmero de elementos do vector. No pior caso, so feitas 2n2 operaes. No caso mdio, so feitas 5n2 / 2 operaes. A complexidade desse algoritmo de Ordem quadrtica. Por isso, ele no recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.

Ordenao por mtodo Bolha (Bubble Sort)


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

import java.awt.*; import javax.swing.*; public class BubbleSort extends JApplet { // initialize applet public void init() { JTextArea outputArea = new JTextArea(); Container container = getContentPane(); container.add( outputArea ); int array[] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; String output = "Data items in original order\n"; // append original array values to String output for ( int counter = 0; counter < array.length; counter++ ) output += " " + array[ counter ]; bubbleSort( array ); // sort array output += "\n\nData items in ascending order\n"; // append sorted\ array values to String output for ( int counter = 0; counter < array.length; counter++ ) output += " " + array[ counter ]; outputArea.setText( output ); }

Exemplo 1: livro Deitel pg 333

Ordenao por mtodo Bolha (Bubble Sort)


21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.

// sort elements of array with bubble sort public void bubbleSort( int array2[] ) { // loop to control number of passes for ( int pass = 1; pass < array2.length; pass++ ) { // loop to control number of comparisons for ( int element = 0; element < array2.length- 1; element++ ) { // compare side b s elements and swap them if - y ide // first element is greater than second element if ( array2[ element ] > array2[ element + 1 ] ) swap( array2, element, element + 1 ); } // end loop to control comparisons } // end loop to control passes } // end method bubbleSort // swap two elements of an array public void swap( int array3[], int first, int second ) { int hold; // temporary holding area for swap hold = array3[ first ]; array3[ first ] = array3[ second ]; array3[ second ] = hold; } } // end class BubbleSort

Ordenao por mtodo Bolha (Bubble Sort)


Exemplo 2: Desenvolva uma verso mais eficiente para o algoritmo do exemplo 1.

Ordenao por insero


um simples algoritmo de ordenao, eficiente quando aplicado a um pequeno nmero de elementos. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e medida que avana vai deixando os elementos mais esquerda ordenados. O algoritmo de insero funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o pquer. Sempre temos dois grupos de elementos: os j ordenados no incio do vetor e os no ordenados no final.

Ordenao por insero


Insere cada elemento do vetor, na sua posio correta em uma subseqncia ordenada de elementos, de modo a mant-la ordenada. Esta forma de ordenao seleciona cada um dos elementos de uma seqncia e os atribui uma posio relativa a seu valor, de acordo com a comparao com os elementos j ordenados da mesma seqncia.

Ordenao por insero

Realizamos N - 1 rodadas. Em cada rodada, um elemento no ordenado deslocado para a esquerda (atravs de trocas com seus vizinhos) at que chegue na sua posio correta dentro do vetor ordenado.

Ordenao por insero


Exemplo: Construa um algoritmo para classificar um vetor de dez elementos reais em ordem crescente.

Ordenao por insero

Ordenao por insero

Ordenao por insero


O tempo gasto para executar o algoritmo do Insertion Sort depende do valor de entrada. Ordenar milhares de nmeros leva bem mais tempo do que ordenar trs nmeros. Alm disso, o Insertion Sort pode levar diferentes quantidades de tempo para ordenar duas sequncias de entrada de mesmo tamanho dependendo do quanto elas j esto ordenadas. O melhor caso para o Insertion Sort quando o array j est ordenado. Neste caso a comparao no lao interno sempre falhar na primeira comparao e o tempo de execuo depender apenas do lao externo. O tempo de execuo obdecer uma funo linear e a complexidade do algoritmo ser de O(n). O pior caso quando o array est na ordem inversa. Nesta situao para cada iterao do lao externo, o lao interno executar n-1 vezes, onde n o valor da varivel j no lao externo. Temos que a complexidade de tempo do algoritmo neste caso ser de O(n(n-1)) = O(n2-n) = O(n2).

Ordenao por insero


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.

public class InsertionSort{ public static void main(String a[]){ int i; int array[] = {12,9,4,99,120,1,3,10}; System.out.println("\n\n Ordenacao\n\n"); System.out.println(" Selection Sort\n\n"); System.out.println("Values Before the sort:\n"); for(i = 0; i < array.length; i++) System.out.print( array[i]+" "); System.out.println(); insertion_srt(array, array.length); System.out.print("Values after the sort:\n"); for(i = 0; i <array.length; i++) System.out.print(array[i]+" "); System.out.println(); System.out.println("PAUSE"); } public static void insertion_srt(int array[], int n){ for (int i = 1; i < n; i++){ int j = i; int B = array[i]; while ((j > 0) && (array[j 1 > B)){ - ] array[j] = array[j ]; - 1 -- ; j } array[j] = B; } } }

Ordenao por seleo


A idia bsica do Mtodo de Seleo , a cada passagem pelo vetor, selecionar o menor elemento e colocar este elemento o mais a esquerda possvel. Para isto deve-se trocar as posies dos elementos do vetor.

Ordenao por seleo


Na primeira passagem troca-se o menor elemento com o que est na primeira posio; Na segunda passagem troca-se o segundo menor elemento com o que est na segunda posio . Assim por diante...

Ordenao por seleo


Desse modo, na passagem i s se deve procurar o menor elemento a partir do isimo at o Nsimo elemento do vetor (os elementos anteriores j estaro ordenados). Note-se que sero necessrias (N-1) passagens, pois, na ltima passagem, o Nsimo elemento j estar na sua posio correta.

Ordenao por seleo


http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html

http://pt.wikipedia.org/wiki/Ficheiro:Selection-Sort-Animation.gif

ttp://www.cs.usask.ca/content/resources/tutorials/csconcepts/1998_4/quick/java/index.

Ordenao por seleo


Vantagens:
Custo linear no tamanho da entrada para o nmero de movimentos de registros. o algoritmo a ser utilizado para arquivos com registros muito grandes. muito interessante para arquivos pequenos.

Desvantagens:
O fato de o arquivo j estar ordenado no ajuda em nada, pois o custo continua quadrtico. O algoritmo no estvel.

Ordenao por seleo

Ordenao por seleo


1.

// SelectionSort.java - sort an array of integers class SelectionSort { public static void main(String[] args) { int[] a = {7, 3, 66, 3, -5, 22, -77, 2}; sort(a); for (int i = 0; i < a.length; i++){ System.out.println("values after sort\n"+ a[i]); } } // sort using the selection sort algorithm static void sort(int[] data) { int next, indexOfNext; for (next = 0; next < data.length - 1; next++) { indexOfNext = min(data,next,data.length - 1); swap(data, indexOfNext, next); } } // find the index of the smallest element in // a specified range of indicies in an array static int min(int[] data, int start, int end) { int indexOfMin = start; // initial guess

2.

3. 4.

5. 6. 7. 8. 9. 10. 11. 12.

13. 14. 15. 16. 17. 18. 19. 20. 21.

Ordenao por seleo


22. 23. 24. 25. 26. 27. 28. 29.

for (int i = start+1; i <= end; i++) if (data[i] < data[indexOfMin]) indexOfMin = i; // found a smaller value return indexOfMin; } // swap to entries in an array static void swap(int[] data, int first, int second){ int temp; temp = data[first]; data[first] = data[second]; data[second] = temp; } }

30. 31. 32. 33. 34.