algoritmo de ordenação colégio batista santos dumont olimpíada brasileira de informática...

23
Algoritmo de Algoritmo de Ordenação Ordenação Colégio Batista Santos Colégio Batista Santos Dumont Dumont Olimpíada Brasileira de Olimpíada Brasileira de Informática Informática Wladimir Araújo Tavares Wladimir Araújo Tavares

Upload: internet

Post on 18-Apr-2015

110 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Algoritmo de Algoritmo de OrdenaçãoOrdenaçãoColégio Batista Santos Colégio Batista Santos

DumontDumont

Olimpíada Brasileira de Olimpíada Brasileira de InformáticaInformática

Wladimir Araújo TavaresWladimir Araújo Tavares

Page 2: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Ordenação por SeleçãoOrdenação por Seleção Idéia :Idéia :A ordenação por seleção, é baseado em se A ordenação por seleção, é baseado em se

passarpassarsempre o maior valor do vetor para a últimasempre o maior valor do vetor para a últimaposição (ou o menor dependendo da ordemposição (ou o menor dependendo da ordemrequerida), depois o de segundo maior valor requerida), depois o de segundo maior valor

para apara apenúltima posição, e assim é feito penúltima posição, e assim é feito

sucessivamentesucessivamentecom os (n-1) elementos restantes, até os últimoscom os (n-1) elementos restantes, até os últimosdois elementos. dois elementos.

Page 3: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

AlgoritmoAlgoritmo

Para i = n até 2 façaPara i = n até 2 faça maior = 1maior = 1 Para j = 2 até i faça Para j = 2 até i faça Se v[j] > v[maior] então Se v[j] > v[maior] então maior = imaior = i aux = v[i]aux = v[i] v[i] = v[maior]v[i] = v[maior] v[maior] = auxv[maior] = aux

Page 4: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Implementação em CImplementação em C

for(i=n;i>=2;i++){for(i=n;i>=2;i++){ maior = 1;maior = 1; for(j=2;i<=i;i++){for(j=2;i<=i;i++){ if(v[j] > v[maior]) if(v[j] > v[maior]) maior = j;maior = j; }} aux = v[i];aux = v[i]; v[i] = v[maior];v[i] = v[maior]; v[maior]=aux;v[maior]=aux; }}

Page 5: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

SimulaçãoSimulação

Devemos encontrar o número que vai fica na Devemos encontrar o número que vai fica na posição 4. O maior do vetor de tamanho 4 está posição 4. O maior do vetor de tamanho 4 está na posição 2. Então troca-se v[2] e v[4]na posição 2. Então troca-se v[2] e v[4]

Devemos encontrar o número que vai fica na Devemos encontrar o número que vai fica na posição 3. Oposição 3. O

maior do vetor de tamanho 3 está na posição 1. maior do vetor de tamanho 3 está na posição 1. EntãoEntão

troca-se v[1] e v[3]troca-se v[1] e v[3]

55 88 44 33

55 33 44 88

Page 6: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Devemos encontrar o número que vai fica naDevemos encontrar o número que vai fica na

posição 2. O maior do vetor de tamanho 2 está posição 2. O maior do vetor de tamanho 2 está nana

posição 1. Então troca-se v[1] e v[2]posição 1. Então troca-se v[1] e v[2]

44 33 55 88

33 44 55 88

Page 7: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Ordenação por BolhaOrdenação por Bolha

Idéia :Idéia :

O ordenação por flutuação (literalmente "porO ordenação por flutuação (literalmente "por

bolha"), é um bolha"), é um algoritmo de ordenaçãoalgoritmo de ordenação dos mais dos mais

simples. A idéia é percorrer o simples. A idéia é percorrer o vetorvetor diversas vezes, diversas vezes,

a cada passagem fazendo flutuar para o topo oa cada passagem fazendo flutuar para o topo o

maior elemento da sequência. Essa movimentaçãomaior elemento da sequência. Essa movimentação

lembra a forma como as bolhas em um lembra a forma como as bolhas em um tanquetanque de de águaágua

procuram seu próprio nível, e disso vem o nome doprocuram seu próprio nível, e disso vem o nome do

algoritmo. algoritmo.

Page 8: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

AlgoritmoAlgoritmo

Para i=1 ate n-1 façaPara i=1 ate n-1 faça troca = falso troca = falso Para j = 1 ate n-i façaPara j = 1 ate n-i faça Se v[j] > v[j+1] entãoSe v[j] > v[j+1] então aux = v[j]aux = v[j] v[j] = v[j+1]v[j] = v[j+1] v[j+1]=auxv[j+1]=aux troca = verdadetroca = verdade Se troca = falso entao pareSe troca = falso entao pare

Page 9: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Implementação em CImplementação em C

for(i=1;i<=n-1;i++){for(i=1;i<=n-1;i++){ troca = 0;troca = 0; for(j=1;j<=n-i;j++){for(j=1;j<=n-i;j++){ if(v[j] > v[j+1]){if(v[j] > v[j+1]){

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

troca=1;troca=1; }}

}} if(troca==0) break;if(troca==0) break;}}

Page 10: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Ordenação por InserçãoOrdenação por Inserção

Idéia:Idéia:A ordenação por inserçãoA ordenação por inserção é um simples é um simplesalgoritmo de ordenaçãoalgoritmo de ordenação, eficiente quando aplicado a um, eficiente quando aplicado a umpequeno número de elementos. Em termos gerais, elepequeno número de elementos. Em termos gerais, elepercorre um vetor de elementos da esquerda para a percorre um vetor de elementos da esquerda para a

direitadireitae à medida que avança vai deixando os elementos mais àe à medida que avança vai deixando os elementos mais àesquerda ordenados. O algoritmo de inserção funciona esquerda ordenados. O algoritmo de inserção funciona

dadamesma maneira com que muitas pessoas ordenam cartasmesma maneira com que muitas pessoas ordenam cartasem um jogo de baralho como o pôquer. em um jogo de baralho como o pôquer.

Page 11: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

AlgoritmoAlgoritmo

Para i = 2 ate n façaPara i = 2 ate n faça

x = v[i]x = v[i]

j = ij = i

Enquanto( v[j-1] > x E j > 1) Enquanto( v[j-1] > x E j > 1) façafaça

v[j] = v[j-1]v[j] = v[j-1]

j = j-1j = j-1

v[j] = x v[j] = x

Page 12: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

SimulaçãoSimulação

55 99 88 66 77

55 99 99 66 77

Para i = 2 temos x = 9

j=2 v[j-1] não é maior que x . v[j] = xPara i = 3 temos que x = 8 j = 3 v[j-1] é maior que x , logo v[j]=v[j-1] j = j-1

j=2 v[j-1] não é maior que xv[j] = x

55 88 99 66 77

Page 13: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Para i = 4 x = 6Para i = 4 x = 6j = 4 v[j-1] > x v[j] = v[j-1]j = 4 v[j-1] > x v[j] = v[j-1]

55 88 99 66 77

55 88 99 99 77

j=3 v[j-1] > x v[j]=v[j-1]55 88 88 99 77

j=2 v[j-1] > x é falsov[j] = x

55 66 88 99 77

Page 14: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

55 66 88 99 77

55 66 88 99 99

55 66 88 88 99

Para i = 5 x = 7j =5 v[j-1] > x v[j]=v[j-1]j=4 v[j-1] > x v[j]=v[j-1]

j=3 v[j-1] < xv[j] = x 55 66 77 88 99

Page 15: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Implementação em CImplementação em C

for(i=2;i<=n;i++){for(i=2;i<=n;i++){x = v[i];x = v[i];j = i;j = i;while(v[j-1] > x && j > 1){while(v[j-1] > x && j > 1){ v[j]=v[j-1];v[j]=v[j-1];

j--;j--;}}v[j]=xv[j]=x

}}

Page 16: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Ordenação utilizando Ordenação utilizando qsortqsort

qsort é uma função de ordenação que qsort é uma função de ordenação que pode serpode ser

utilizada nas provas da OBI.utilizada nas provas da OBI.

A assinatura da função é :A assinatura da função é :

void qsort ( void * base, size_t num, void qsort ( void * base, size_t num, size_t size, int ( * compara ) ( const size_t size, int ( * compara ) ( const void *, const void * ) );void *, const void * ) );

Page 17: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

ParâmetrosParâmetros base é um ponteiro para o primeiro base é um ponteiro para o primeiro

elemento do vetor que se deseja elemento do vetor que se deseja ordenar.ordenar.

num é o número de elementos do vetor num é o número de elementos do vetor apontado pelo ponteiro base.apontado pelo ponteiro base.

size número de bytes de cada elemento size número de bytes de cada elemento do vetor.do vetor.

compara é uma função que compara os compara é uma função que compara os elementos do vetor.A função aceita elementos do vetor.A função aceita como parâmetro dois ponteiros para como parâmetro dois ponteiros para elementos do vetor do tipo void*.elementos do vetor do tipo void*.

Page 18: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

O valor de retorno da função será:O valor de retorno da função será:• negativo , se o elem1 menor que negativo , se o elem1 menor que

elem2elem2• Zero , se o elem1 igual a elem2Zero , se o elem1 igual a elem2• Positivo , se o elem1 maior que Positivo , se o elem1 maior que

elem2elem2

Page 19: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

/* qsort example */ #include <stdio.h> /* qsort example */ #include <stdio.h> #include <stdlib.h> #include <stdlib.h> int values[] = { 40, 10, 100, 90, 20, 25 }; int values[] = { 40, 10, 100, 90, 20, 25 }; int compare (const void * a, const void * b){ int compare (const void * a, const void * b){ return ( *(int*)a - *(int*)b ); return ( *(int*)a - *(int*)b );

} } int main () int main () { { int * pItem; int * pItem; int n; int n; qsort (values, 6, sizeof(int), compare); qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) for (n=0; n<6; n++) printf ("%d ",values[n]); printf ("%d ",values[n]); return 0; return 0; }}

Page 20: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Vamos supor que no nosso problema temos Vamos supor que no nosso problema temos umum

Dado composto. Por exemplo, um aluno que Dado composto. Por exemplo, um aluno que temtem

um código e uma nota. Queremos ordenarum código e uma nota. Queremos ordenar

utilizando o qsort. Mas se utilizarmos dois utilizando o qsort. Mas se utilizarmos dois vetoresvetores

Não vai funcionar!Não vai funcionar!

Exemplo:Exemplo:

#define MAX_ALUNOS 100#define MAX_ALUNOS 100

int codigo[MAX_ALUNOS];int codigo[MAX_ALUNOS];

int nota[MAX_ALUNOS];int nota[MAX_ALUNOS];

Page 21: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Se utilizarmos o qsort com o vetor o códigoSe utilizarmos o qsort com o vetor o código

teremos um problema.Por exemplo, teremos um problema.Por exemplo, codigo[1] terácodigo[1] terá

o código de um aluno e nota[1] será a nota o código de um aluno e nota[1] será a nota de umde um

outro aluno. Teremos que juntar essas duasoutro aluno. Teremos que juntar essas duas

informações em uma variável.informações em uma variável.

#define MAX_ALUNOS 100#define MAX_ALUNOS 100

struct aluno{ struct aluno{

int codigo, nota; int codigo, nota;

}alunos[MAX_ALUNOS]; }alunos[MAX_ALUNOS];

Page 22: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Quando ordenamos o vetor aluno não vamos Quando ordenamos o vetor aluno não vamos maismais

separar informações.separar informações.Vamos usar o qsort:Vamos usar o qsort:Seja n a quantidade de alunosSeja n a quantidade de alunosqsort(alunos,n,sizeof(alunos[0]),compara).qsort(alunos,n,sizeof(alunos[0]),compara).Vamos ordenar por código:Vamos ordenar por código:int compara(const void *a , const void *b){int compara(const void *a , const void *b){

struct aluno alunoa = *(*aluno)a;struct aluno alunoa = *(*aluno)a;struct aluno alunob = *(*aluno)b;struct aluno alunob = *(*aluno)b;return alunoa.codigo – alunob.codigo;return alunoa.codigo – alunob.codigo;

}}

Page 23: Algoritmo de Ordenação Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares

Localização de um Localização de um depósitodepósito

Vamos supor que exista uma rede de Vamos supor que exista uma rede de lanchonetelanchonete

em uma rede. Devemos escolher uma dasem uma rede. Devemos escolher uma das

lanchonetes para instalar um depósito de lanchonetes para instalar um depósito de tal formatal forma

que o somatório das distâncias para todas que o somatório das distâncias para todas as outrasas outras

lanchonetes seja minimizado?lanchonetes seja minimizado?

Solução : MedianaSolução : Mediana