UNIP - Ciência da Computação e Sistemas de Informação Estrutura de Dados AULA 9 Ordenação de Dados Estrutura de Dados 1 Ordenação de Dados • Processo bastante utilizado na computação de uma estrutura de dados • Dados ordenados garantem uma melhor performance de pesquisa a uma ED. Estrutura de Dados 2 Compromisso “A complexidade da ordenação da ED não deve exceder a complexidade da computação a ser feita na ED sem o processo de ordenação” • Exemplo: deseja-se realizar uma única pesquisa a um vetor: – busca seqüencial O(n) – ordenação O(n log n) – Não vale a pena ordenar! Estrutura de Dados 3 Métodos de Ordenação Métodos de Ordenação Simples • Ordenação por troca – BubbleSort (método da bolha) – QuickSort (método da troca e partição) • Ordenação por inserção – InsertionSort (método da inserção direta) – BinaryInsertionSort (método da inserção direta binária) • Ordenação por seleção – SelectionSort (método da seleção direta) – HeapSort (método da seleção em árvore) • Outros métodos – MergeSort (método da intercalação) – BucketSort (método da distribuição de chave) Estrutura de Dados 4 Métodos de Ordenação Simples • Características: – fácil implementação – alta complexidade – comparações ocorrem sempre entre posições adjacentes do vetor (estático ou dinâmico) Estrutura de Dados 5 Métodos de Ordenação • Vamos apresentar 3 métodos: – – – Bubble Sort Insertion Sort Quick Sort Fonte: http://partilho.com.br/java-netbeans/ordenacao-em-java-metodos-programar/ Estrutura de Dados 6 Bubble Sort • O bubble sort, ou ordenação por flutuação (literalmente "por bolha"), é um algoritmo de ordenação dos mais simples. A ideia é percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topo o maior elemento da sequência. Essa movimentação lembra a forma como as bolhas em um tanque de água procuram seu próprio nível, e disso vem o nome do algoritmo. Estrutura de Dados 7 Bubble Sort • No melhor caso, o algoritmo executa n operações relevantes, onde n representa o número de elementos do vetor. No pior caso, são feitas n^2 operações. A complexidade desse algoritmo é de Ordem quadrática. Por isso, ele não é recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados. Estrutura de Dados 8 Bubble Sort • O método bubble sort trabalha comparando todos os valores dos vetores, por exemplo o primeiro com o segundo depois com o terceiro, e assim por diante até o último valor, depois ele inicia o mesmo processo só que uma posição a mais comparando o segundo com o primeiro, depois com o terceiro. A ideia é a de que os valores maiores ou mais “pesados” vão descendo enquanto os mais leves ficam em cima e, por isso, é chamado de método bolha. Esse processo de comparação passa por uma condição que se um valor for menor que o outro eles trocam de posição. Estrutura de Dados 9 Bubble Sort int[] vet = {8, 19, 31, 25, 1}; int aux = 0; int i = 0; System.out.println("Vetor desordenado: "); for (i = 0; i < 5; i++) { System.out.println(" " + vet[i]); } System.out.println(" "); for (i = 0; i < 5; i++) { for (int j = 0; j < 4; j++) { if (vet[j] > vet[j + 1]) { aux = vet[j]; vet[j] = vet[j + 1]; vet[j + 1] = aux; } } } System.out.println("Vetor organizado:"); for (i = 0; i < 5; i++) { System.out.println(" " + vet[i]); } Estrutura de Dados 10 InsertionSort • Insertion sort, ou ordenação por inserção, é um simples algoritmo de ordenação, eficiente quando aplicado a um pequeno número de elementos. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. O algoritmo de inserção funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o pôquer. Esse algoritmo se baseia no processo de inserção, dessa forma quando ele recebe um novo valor ele sempre vai o alocar na posição que corresponde a sua faixa de ordenação. Estrutura de Dados 11 InsertionSort int element[] = {22, 9, 7, 6, 1, 49, 35, 3, 0}; int chave, i; System.out.print("Lista Original: "); for (int x = 0; x < element.length; x++){ System.out.print(element[x] + ", ");} for (int j = 1; j < element.length; j++) { chave = element[j]; i = j - 1; while (i >= 0 && element[i] > chave) { element[i + 1] = element[i]; i = i - 1; } element[i + 1] = chave;} System.out.print("\nLista reordenada: "); for (int j = 0; j < element.length; j++) { System.out.print(element[j] + ", ");} Estrutura de Dados 12 QuickSort • O algoritmo Quicksort é um método de ordenação muito rápido e eficiente, inventado por C.A.R. Hoare em 1960, quando visitou a Universidade de Moscovo como estudante. Naquela época, Hoare trabalhou em um projeto de tradução de máquina para o National Physical Laboratory. Ele criou o 'Quicksort ao tentar traduzir um dicionário de inglês para russo, ordenando as palavras, tendo como objetivo reduzir o problema original em subproblemas que possam ser resolvidos mais facil e rapidamente. Estrutura de Dados 13 QuickSort • A medida que o vetor vai sendo ordenado vão sendo realizadas partições recursivas com objetivo de ganhar desempenho. Estrutura de Dados 14 QuickSort public class TestaQuick { public static int[] vetor = {56, 446, 389, 18, 446, 17, 493, 186, 455, 94, 374, 119, 81, 250, 496, 84, 129, 73, 414, 156, 199, 84, 17, 16, 56}; public static void main(String[] args) { System.out.print("Vetor de Entrada: "); imprime(vetor); quick_sort(vetor,0, vetor.length - 1); System.out.print("\nVetor Ordenado: "); imprime(vetor); System.exit(0); } Estrutura de Dados 15 QuickSort public static void imprime(int[] aux) { for (int i = 0; i < vetor.length; i++) { System.out.print(" " + aux[i]); } } public static void quick_sort(int[] v, int ini, int fim) { int meio; if (ini < fim) { meio = partition(v, ini, fim); quick_sort(v, ini, meio); quick_sort(v, meio + 1, fim); } } Estrutura de Dados 16 QuickSort public static int partition(int[] v, int ini, int fim) { int pivo, topo, i; pivo = v[ini]; topo = ini; for (i = ini + 1; i <= fim; i++) { if (v[i] < pivo) { v[topo] = v[i]; v[i] = v[topo + 1]; topo++; } } v[topo] = pivo; return topo; } } Estrutura de Dados 17