metodos de ordenação

9
Estruturas de Dados e Algoritmos (C/C++) – Aula 08 (Prof. Sílvio) pag. 1 Aula 08 - Conteúdo 1) Algoritmos de Ordenação 2) Algoritmos de Busca 3) Implementações destes algoritmos 4) Exercícios Introdução Estudaremos, neste tópico, os seguintes métodos de classificação: a) Classificação por troca Buble Sort (método bolha) Quick Sort b) Classificação por seleção Selection Sort (método da seleção) c) Classificação por inserção Insertion Sort (método da inserção) Shell Sort d) Classificação por intercalação Merge Array Merge Sort e) Classificação de Raízes Radix Sort Para efeitos de explicação utilizaremos tanto nos métodos de busca quanto nos métodos de ordenação, nos casos que assim permitirem, um vetor x de inteiros de tamanho n, sendo que os índices do vetor x assumiram valores entre 0 e n-1. Obs.: apesar dos algoritmos implementados utilizarem um vetor, podemos estender a lógica das classificações também para arquivos. Algoritmos de Ordenação Classificação por Troca Buble Sort (Método Bolha – arquivo Ex801.cpp) A idéia básica do Buble Sort é percorrer os dados do vetor (arquivo) sequencialmente várias vezes. Em cada passagem pelos dados devemos comparar cada elemento com o seu sucessor (x[k] com x[k+1]). Se os elementos não estiverem ordenados devemos trocá-los de posição. Exemplo: Iteração 0: 25 57 48 37 12 92 86 33 Iteração 1: 25 48 37 12 57 86 33 92 Iteração 2: 25 37 12 48 57 33 86 92 Iteração 3: 25 12 37 48 33 57 86 92 Iteração 4: 12 25 37 33 48 57 86 92 Iteração 5: 12 25 33 37 48 57 86 92 Iteração 6: 12 25 33 37 48 57 86 92 Iteração 7: 12 25 33 37 48 57 86 92

Upload: diego-paoliello

Post on 07-Nov-2015

78 views

Category:

Documents


6 download

DESCRIPTION

Metodos de ordenação

TRANSCRIPT

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 1

    Aula 08 - Contedo 1) Algoritmos de Ordenao 2) Algoritmos de Busca 3) Implementaes destes algoritmos 4) Exerccios

    Introduo Estudaremos, neste tpico, os seguintes mtodos de classificao: a) Classificao por troca

    Buble Sort (mtodo bolha) Quick Sort

    b) Classificao por seleo Selection Sort (mtodo da seleo)

    c) Classificao por insero Insertion Sort (mtodo da insero) Shell Sort

    d) Classificao por intercalao Merge Array Merge Sort

    e) Classificao de Razes Radix Sort

    Para efeitos de explicao utilizaremos tanto nos mtodos de busca quanto nos mtodos de ordenao, nos casos que assim permitirem, um vetor x de inteiros de tamanho n, sendo que os ndices do vetor x assumiram valores entre 0 e n-1.

    Obs.: apesar dos algoritmos implementados utilizarem um vetor, podemos estender a lgica das classificaes tambm para arquivos.

    Algoritmos de Ordenao

    Classificao por Troca

    Buble Sort (Mtodo Bolha arquivo Ex801.cpp) A idia bsica do Buble Sort percorrer os dados do vetor (arquivo)

    sequencialmente vrias vezes. Em cada passagem pelos dados devemos comparar cada elemento com o seu sucessor (x[k] com x[k+1]). Se os elementos no estiverem ordenados devemos troc-los de posio.

    Exemplo: Iterao 0: 25 57 48 37 12 92 86 33 Iterao 1: 25 48 37 12 57 86 33 92 Iterao 2: 25 37 12 48 57 33 86 92 Iterao 3: 25 12 37 48 33 57 86 92 Iterao 4: 12 25 37 33 48 57 86 92 Iterao 5: 12 25 33 37 48 57 86 92 Iterao 6: 12 25 33 37 48 57 86 92 Iterao 7: 12 25 33 37 48 57 86 92

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 2

    Note que na iterao 1 o maior elemento (92) est na posio correta, na iterao 2 o elemento 86 est na posio correta e na iterao k o elemento x[n-k] estar na posio correta. Podemos melhorar a rapidez deste algoritmos com a seguinte alterao:

    Iterao 1: (n-1) comparaes Iterao 2: (n-2) comparaes Iterao 3: (n-3) comparaes : : ltima Iterao: 1 comparao ( x[0] com x[1] )

    Obs.: note que pode ocorrer dos dados estarem ordenados antes de se efetuar (n-1) passagens pelo vetor

    Algoritmo Buble Sort void buble(int x[], int n) { int aux, j, passo, chave = 1; for(passo=0; passo < n-1 && chave; passo++) { chave = 0; for(j=0; j < n-passo-1; j++) { if ( x[j] > x[j+1] ) { chave = 1; aux = x[j]; x[j] = x[j+1]; x[j+1] = aux; } } } }

    Quicksort (Mtodo Rpido arquivo Ex802.cpp) Devemos escolher um elemento b qualquer do vetor x (por exemplo o 1

    elemento - b=x[0] ) e baseado neste elemento devemos particionar x as seguinte forma:

    colocamos b na sua posio correta j todos os elementos entre 0 e j-1 devem ser menores do que b ( x[j] ) todos os elementos entre j+1 e n devem ser maiores do que b ( x[j] )

    Aps particionarmos o vetor devemos repetir o processo para os subvetores entre x[0] at x[j-1] e x[j+1] at x[n-1] e assim sucessivamente.

    Exemplo: 25 57 48 37 12 92 86 33 12 25 48 37 57 92 86 33 12 25 48 37 57 92 86 33 12 25 33 37 48 92 86 57 12 25 33 37 48 92 86 57 12 25 33 37 48 92 86 57 12 25 33 37 48 57 86 92 12 25 33 37 48 57 86 92 12 25 33 37 48 57 86 92

    Algoritmo Quicksort

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 3

    void Particionar(int x[], int lb, int ub, int *pj) { int a, temp, down, up;

    a = x[lb]; up = ub; down = lb; while ( down < up ) { while ( x[down] a ) up--; if ( down < up ) { temp = x[down]; x[down] = x[up]; x[up] = temp; } } x[lb] = x[up]; x[up] = a; *pj = up; }

    void Quicksort(int x[], int lb, int ub) { int j;

    if ( lb >= ub ) return; Particionar(x,lb,ub,j); Quicksort(x,lb,j-1); Quicksort(x,j+1,ub); }

    Classificao por Seleo

    Selection Sort (Mtodo da Seleo arquivo Ex803.cpp) Este mtodo consiste em encontrar repetidamente o maior elemento do vetor x

    (ou subvetor) e coloc-lo na sua devida posio. Maior dos (n-1) elementos: trocar com o n-simo elemento Maior dos (n-2) elementos: trocar com o (n-1)-simo elemento : : Maior dos 2 ltimos elementos torcar com o segundo elemento

    Exemplo: Iterao 0: 25 57 48 37 12 92 86 33 Iterao 1: 25 57 48 37 12 33 86 92 Iterao 2: 25 57 48 37 12 33 86 92 Iterao 3: 25 33 48 37 12 57 86 92 Iterao 4: 25 33 12 37 48 57 86 92 Iterao 5: 25 33 12 37 48 57 86 92 Iterao 6: 25 12 33 37 48 57 86 92 Iterao 7: 12 25 33 37 48 57 86 92

    Algoritmo Selection Sort void selectSort(int x[], int n) { int i, indx, j, maior; for(i=n-1; i > 0; i--) {

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 4

    maior = x[0]; indx = 0; for(j=1; j maior ) { maior = x[j]; indx = j; } } x[indx] = x[i]; x[i] = maior; } }

    Classificao por Insero Insertion Sort (Mtodo da Insero arquivo Ex804.cpp) Neste mtodo devemos inserir os elementos nas suas posies corretas

    utilizando o arquivo (vetor) original de dados. Em cada iterao tomamos um elemento e o colocamos na sua posio correta deslocando os elemenstos que esto em posies incorretas.

    Exemplo: Iterao 0: 25 57 48 37 12 92 86 33 Iterao 1: 25 57 Iterao 2: 25 48 57 Iterao 3: 25 37 48 57 Iterao 4: 12 25 37 48 57 Iterao 5: 12 25 37 48 57 92 Iterao 6: 12 25 37 48 57 86 92 Iterao 7: 12 25 33 37 48 57 86 92

    Algoritmo Insertion Sort void InsertSort(int x[], int n) { int i,k,y; for(k=1; k= 0 && y < x[i]; i--) x[i+1] = x[i]; x[i+1] = y; } }

    Shell Sort (arquivo Ex805.cpp) A classificao Shell ou classificao de incremento decrescente particiona o

    arquivo (vetor) original em k subarquivos (subvetores) e depois classifica cada um deles. Aps a ordenao dos k subarquivos, ser definido um novo valor de k (menor que o anterior) e o processo de particionamento e classificao de subarquivos continuar at o arquivo (vetor) original estar ordenado.

    Exemplo: Seja o arquivo (vetor) original abaixo: x = (25 57 48 37 12 92 86 33)

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 5

    Considere a seqncia de incrementos k = (5, 3, 1)

    Iterao 1 (k = 5) subarquivos (subvetores) abaixo (25 92) (x[0] x[5]) => (25 92) (57 86) (x[1] x[6]) => (57 86) (48 33) (x[2] x[7]) => (33 48) (37) (x[3]) => (37) (12) (x[4]) => (12) x = (25 57 33 37 12 92 86 48)

    Iterao 2 (k = 3) subarquivos (subvetores) abaixo (25 37 86) (x[0] x[3] x[6]) => (25 37 86) (57 12 48) (x[1] x[4] x[7]) => (12 48 57) (33 92) (x[2] x[5]) => (33 92) x = (25 12 33 37 48 92 86 57)

    Iterao 2 (k = 1) subarquivo (subvetor) abaixo (25 12 33 37 48 92 86 57) (x[0] x[1] ... x[7]) x = (25 12 33 37 48 92 86 57)

    Algoritmo Shell Sort void ShellSort(int x[], int n, int incrmnts[], int numinc) { int incr,j,k,tam,y; for(incr = 0; incr < numinc; incr++) { tam = incrmnts[incr]; for(j = tam; j < n; j++) { y = x[j]; for(k = j-tam; k >= 0 && y < x[k]; k -= tam) x[k+tam]=x[k]; x[k+tam] = y; } } }

    Classificao por Intercalao A classificao por intercalao tem como idia principal combinar dois ou

    mais vetores (arquivos) classificados num outro vetor (arquivo) tambm classificado.

    Merge Array (arquivo Ex806.cpp) O mtodo abaixo toma dois vetores j ordenados a e b de tamanhos na e nb,

    respectivamente, e monta um vetor c de tamanho nc (na+nb), tambm ordenado, atravs da intercalao dos elementos de a e b.

    Exemplo: a = (5 7 10 15 20 25) na = 6 b = (2 4 12 13 17 32 40) nb = 7 c = (2 4 5 7 10 12 13 15 17 20 25 32 40) nc = 13

    Algoritmo Merge Array

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 6

    void MergeArr(int a[],int b[],int c[],int na,int nb,int nc) { int ap, bp, cp;

    if ( nc != na+nb ) { cout

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 7

    for(i = 0; i < n; i++) x[i] = aux[i]; tam *= 2; } }

    Classificao de Razes

    Radix Sort (arquivo Ex808.cpp) Este mtodo de classificao baseia-se nas representaes posicionais dos

    valores dos dgitos dos nmeros a serem classificados. Exemplo: Vetor original x = (25 57 48 37 12 92 86 33)

    Filas baseadas no dgito menos significativo Incio Final Fila [0] Fila [1] Fila [2] 12 ... 92 Fila [3] 33 Fila [4] Fila [5] 25 Fila [6] 86 Fila [7] 57 ... 37 Fila [8] 48 Fila [9] Aps a primeira passagem temos: Vetor x = (12 92 33 25 86 57 37 48)

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 8

    Filas baseadas no dgito mais significativo Incio Final Fila [0] Fila [1] 12 Fila [2] 25 Fila [3] 33 ... 37 Fila [4] 48 Fila [5] 57 Fila [6] Fila [7] Fila [8] 86 Fila [9] 92

    Aps a segunda passagem temos: Vetor x = (12 25 33 37 48 57 86 92)

    Algoritmo Radix Sort em notao algoritmica Para (k=dgito menos signif; k

  • Estruturas de Dados e Algoritmos (C/C++) Aula 08 (Prof. Slvio) pag. 9

    cout