Introdução à ordenação

Embed Size (px)

Text of Introdução à ordenação

  • Ordenao: Introduo e mtodos elementares

    Algoritmos e Estruturas de Dados II

  • Ordenao

    Objetivo: Rearranjar os itens de um vetor ou lista de modo que

    suas chaves estejam ordenadas de acordo com alguma regra

    Estrutura:typedef int chave_t;

    struct item {

    chave_t chave;

    /* outros componentes */

    };

    2

    E X E M P L O E E L M O P X

  • Critrios de Classificao

    Localizao dos dados: Ordenao interna

    Todas os dados esto em memria principal (RAM)

    Ordenao externa Memria principal no cabe todos os dados Dados armazenados em memria secundria (disco) Dados armazenados em memria secundria (disco)

    3

  • Critrios de Classificao

    Estabilidade: Mtodo estvel se a ordem relativa dos registros com

    a mesma chave no se altera aps a ordenao.

    Adams A

    Black B

    Brown D

    Adams A

    Smith A

    Washington B

    Adams A

    Smith A

    Black B

    4

    Brown D

    Jackson B

    Jones D

    Smith A

    Thompson D

    Washington B

    White C

    Wilson C

    Washington B

    Jackson B

    Black B

    White C

    Wilson C

    Thompson D

    Brown D

    Jones D

    Black B

    Jackson B

    Washington B

    White C

    Wilson C

    Brown D

    Jones D

    Thompson D

  • Critrios de Classificao

    Adaptabilidade: Um mtodo adaptvel quando a sequencia de

    operaes realizadas depende da entrada Um mtodo que sempre realiza as mesmas operaes,

    independende da entrada, no adaptvel.

    5

  • Critrios de Classificao

    Uso da memria: In place: ordena sem usar memria adicional ou

    usando uma quantidade constante de memria adicional

    Alguns mtodos precisam duplicar os dados

    6

  • Critrios de Classificao

    Movimentao dos dados: Direta: estrutura toda movida

    // struct item a;// struct item b;struct item aux = a;a = b;b = aux;

    Indireta: apenas as chaves so acessadas e ponteiros para as estruturas so rearranjados

    7

    // struct item *a;// struct item *b;struct item *aux = *a;a = b;b = aux;

  • Critrios de Avaliao

    Seja n o nmero de registros em um vetor, considera-se duas medidas de complexidade: Nmero de comparaes C(n) entre as chaves Nmero de trocas ou movimentaes M(n) de itens

    #define troca(A, B) {struct item c = A; A = B; B = c;}

    void ordena(struct item *v, int n) {

    8

    void ordena(struct item *v, int n) {

    int i, j;

    for(i = 0; i < n-1; i++) {

    for(j = n-1; j > i; j--) {

    if(v[j-1].chave > v[j].chave) /* comparaes */

    troca(v[j-1], v[j]); /* trocas */

    }

    }

    }

  • Ordenao por Seleo

    Procura o n-simo menor elemento do vetor Troca do n-simo menor elemento com o

    elemento na n-sima posio Repete at ter colocado todos os elementos em

    suas posies

    9

    Elementos so movimentados apenas uma vez

  • Ordenao por Seleo

    void selecao(struct item *v, int n){

    int i, j, min;

    for(i = 0; i < n - 1; i++) {

    min = i;

    for(j = i + 1 ; j < n; j++) {

    if(v[j].chave < v[min].chave)

    min = j;

    E X E M P L O

    E X E M P L O

    E E X M P L O

    E E L M P X O

    E E L M P X O

    E E L M O X P

    E E L M O P X

    10

    }

    troca(v[i], v[min]);

    }

    }

    E E L M O P X

    E E L M O P X

  • Ordenao por Seleo: Complexidade

    Comparaes C(n):

    )(

    )())((

    )(

    )()(

    22

    2

    0

    2

    0

    2

    0

    2

    0

    12

    121

    11

    nOnn

    nnn

    nn

    ininnC

    n

    i

    n

    i

    n

    i

    n

    i

    ==

    =

    ==

    =

    =

    =

    =

    11

    Movimentaes M(n):

    )( 2

    2nO

    nn ==

    )1(3)( = nnM

  • Ordenao por Seleo

    Vantagens: Custo linear no tamanho da entrada para o nmero de

    movimentos de registros a ser utilizado quando h registros muito grandes

    Desvantagens:

    12

    Desvantagens: No adaptvel

    No importa se o arquivo est parcialmente ordenado

    Algoritmo no estvel

  • Ordenao por Insero

    Algoritmo utilizado pelo jogador de cartas Jogador mantm as cartas em sua mo ordenadas Quando compra ou recebe uma nova carta, o jogador

    encontra qual posio ela deve ocupar em sua mo

    Implementao para vetores:

    13

    Implementao para vetores: Mantemos os elementos entre zero e i-1 ordenados

    Note que o arranjo entre formado por um elemento est ordenado, por definio

    Achamos a posio do i-simo elemento e inserimos ele entre os i-1 que j estavam ordenados

    O programa repete esse passo at ordenar todos os elementos

  • Mtodo Insero

    14

  • Ordenao por Insero

    void insercao(struct item *v, int n) {

    int i, j;

    struct item aux;

    for(i = 1; i < n; i++) {

    for(j = i; j >= 0; k--) {

    if(v[j-1].chave > v[j].chave) {

    troca(v[j-1], v[j]);

    15

    }

    }

    }

    }

    E X E M P L O

    E X E M P L O

    E E X M P L O

    E E M X P L O

    E E M P X L O

    E E L M P X O

    E E L M O P X

  • Ordenao por Insero Melhorado

    void insercao(struct item *v, int n) {

    int i, j;

    struct item aux;

    for(i = 1; i < n; i++) {

    aux = v[i];

    j = i - 1;

    while((j >= 0) && (aux.chave < v[j].chave)) {

    16

    v[j + 1] = v[j];

    j--;

    }

    v[j + 1] = aux;

    }

    }

    E X E M P L O

    E X E M P L O

    E E X M P L O

    E E M X P L O

    E E M P X L O

    E E L M P X O

    E E L M O P X

  • Ordenao por Insero: Complexidade

    Comparaes C(n): Anel interno: i-sima iterao, valor de Ci

    melhor caso: Ci = 1

    pior caso: Ci = i

    caso mdio: Ci = (1 + 2 + 3 + ... + i) / i

    17

    Para o caso mdio, assumimos que todas as permutaes de entrada so igualmente provveis.

    2

    1

    2

    )1(11

    1

    +=

    +== =

    iii

    ik

    iC

    i

    ki

  • Ordenao por Insero: Complexidade

    Comparaes C(n): Anel externo:

    Complexidade total: Melhor caso (itens j esto ordenados)

    =

    1

    1

    n

    iiC

    18

    Melhor caso (itens j esto ordenados)

    Pior caso (itens em ordem reversa):

    =

    ===1

    1

    )(11)(n

    i

    nOnnC

    )(222

    ))(1()( 2

    1

    1

    2

    nOnnnn

    inCn

    i

    ====

    =

  • Ordenao por Insero: Complexidade

    Comparaes C(n): Caso mdio:

    +=

    +=+=

    =

    =

    =

    )1(2

    )1(

    2

    11

    2

    1

    2

    1)(

    1

    1

    1

    1

    1

    1

    nnn

    ii

    nCn

    i

    n

    i

    n

    i

    )(11 2

    22

    nOnnnnn =+=

    +

    =

    19

    )(2

    1

    442

    1

    42nO

    nnnnn =+=

    +

    =

  • Ordenao por Insero: Exemplos

    Melhor Caso:1 2 3 4 5 6

    1 2 3 4 5 6

    1 2 3 4 5 6

    1 2 3 4 5 6

    1 2 3 4 5 6

    1 2 3 4 5 6

    20

    Pior Caso:

    1 2 3 4 5 6

    6 5 4 3 2 1

    5 6 4 3 2 1

    4 5 6 3 2 1

    3 4 5 6 2 1

    2 3 4 5 6 1

    1 2 3 4 5 6

  • Ordenao por Insero

    Vantagens: Lao interno eficiente, insero adequado para

    ordenar vetores pequenos o mtodo a ser utilizado quando o arquivo est

    quase ordenado um bom mtodo quando se deseja adicionar poucos

    21

    um bom mtodo quando se deseja adicionar poucos itens a um arquivo ordenado, pois o custo linear

    O algoritmo de ordenao por insero estvel

    Desvantagens: Nmero de comparaes tem crescimento quadrtico Alto custo de movimentao de elementos no vetor

  • Ordenao pelo Mtodo da Bolha

    Ideia Passa no arquivo e troca elementos adjacentes que

    esto fora de ordem Repete esse processo at que o arquivo esteja

    ordenado

    Algoritmo

    22

    Compara dois elementos adjacentes e troca de posio se estiverem fora de ordem

    Quando o maior elemento do vetor for encontrado, ele ser trocado at ocupar a ltima posio

    Na segunda passada, o segundo maior ser movido para a penltima posio do vetor, e assim sucessivamente

  • Ordenao pelo Mtodo da Bolha

    E X E M P L O

    E E X M P L O

    E E M X P L O

    E E M P X L O

    E E M P L X O

    E E M P L O X

    E E M P L O X

    1 passada

    23

    E E M P L O X

    E E M P L O X

    E E M L P O X

    E E M L P O X

    2 passada

  • Ordenao pelo Mtodo da Bolha

    void bolha(struct item *v, int n) {

    int i, j;

    for(i = 0; i < n-1; i++) {

    for(j = 1; j < n-i; j++) {

    if(v[j].chave < v[j-1].chave)

    troca(v[j-1], v[j]);

    }

    24

    }

    }

    }

  • Ordenao pelo Mtodo da Bolha

    void bolha(struct item *v, int n) {

    int i, j;

    for(i = 0; i < n-1; i++) {

    for(j = 1; j < n-i; j++) {

    if(v[j].chave < v[j-1].chave)

    troca(v[j-1], v[j]);

    }

    25

    }

    }

    }

    E X E M P L O

    E E M P L O X

    E E M L O P X

    E E L M O P X

    E E L M O P X

    E E L M O P X

    E E L M O P X

    E E L M O P X

  • Ordenao pelo Mtodo da Bolha: Complexidade

    void bolha(struct item *v, int n) {

    int i, j;

    for(i = 0; i < n-1; i++) {

    for(j = 1; j < n-i; j++) {

    if(v[j].chave < v[j-1].chave)

    troca(v[j-1], v[j]);

    }

    26

    }

    }

    }

    )(

    )())((

    )(

    )()(

    22

    2

    0

    2

    0