algoritmo de ordenação colégio batista santos dumont olimpíada brasileira de informática...
TRANSCRIPT
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
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.
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
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; }}
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
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
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.
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
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;}}
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.
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
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
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
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
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
}}
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 * ) );
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*.
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
/* 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; }}
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];
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];
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;
}}
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