A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Algoritmo de Ordenação

Apresentações semelhantes


Apresentação em tema: "Algoritmo de Ordenação"— Transcrição da apresentação:

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

2 Ordenação por Seleção Idéia :
A ordenação por seleção, é baseado em se passar sempre o maior valor do vetor para a última posição (ou o menor dependendo da ordem requerida), depois o de segundo maior valor para a penúltima posição, e assim é feito sucessivamente com os (n-1) elementos restantes, até os últimos dois elementos.

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

4 Implementação em C for(i=n;i>=2;i++){ maior = 1;
for(j=2;i<=i;i++){ if(v[j] > v[maior]) maior = j; } aux = v[i]; v[i] = v[maior]; v[maior]=aux;

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

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

7 Ordenação por Bolha Idéia :
O ordenação por flutuação (literalmente "por bolha"), é um algoritmo de ordenação dos mais simples. A idéia é 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.

8 Algoritmo Para i=1 ate n-1 faça troca = falso Para j = 1 ate n-i faça
Se v[j] > v[j+1] então aux = v[j] v[j] = v[j+1] v[j+1]=aux troca = verdade Se troca = falso entao pare

9 Implementação em C for(i=1;i<=n-1;i++){ troca = 0;
for(j=1;j<=n-i;j++){ if(v[j] > v[j+1]){ aux = v[j]; v[j]=v[j+1]; v[j+1]=aux; troca=1; } if(troca==0) break;

10 Ordenação por Inserção
Idéia: A 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.

11 Algoritmo Para i = 2 ate n faça x = v[i] j = i
Enquanto( v[j-1] > x E j > 1) faça v[j] = v[j-1] j = j-1 v[j] = x

12 Simulação 5 9 8 6 7 5 9 6 7 5 8 9 6 7 Para i = 2 temos x = 9
j=2 v[j-1] não é maior que x . v[j] = x Para i = 3 temos que x = 8 j = 3 v[j-1] é maior que x , logo v[j]=v[j-1] j = j-1 5 9 6 7 j=2 v[j-1] não é maior que x v[j] = x 5 8 9 6 7

13 5 8 9 6 7 Para i = 4 x = 6 j = 4 v[j-1] > x v[j] = v[j-1] 5 8 9 7 j=3 v[j-1] > x v[j]=v[j-1] 5 8 9 7 j=2 v[j-1] > x é falso v[j] = x 5 6 8 9 7

14 j =5 v[j-1] > x v[j]=v[j-1] j=4 v[j-1] > x v[j]=v[j-1]
6 8 9 7 Para i = 5 x = 7 j =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] < x v[j] = x 5 6 8 9 5 6 8 9 5 6 7 8 9

15 Implementação em C for(i=2;i<=n;i++){ x = v[i]; j = i;
while(v[j-1] > x && j > 1){ v[j]=v[j-1]; j--; } v[j]=x

16 Ordenação utilizando qsort
qsort é uma função de ordenação que pode ser utilizada nas provas da OBI. A assinatura da função é : void qsort ( void * base, size_t num, size_t size, int ( * compara ) ( const void *, const void * ) );

17 Parâmetros base é um ponteiro para o primeiro elemento do vetor que se deseja ordenar. num é o número de elementos do vetor apontado pelo ponteiro base. size número de bytes de cada elemento do vetor. compara é uma função que compara os elementos do vetor.A função aceita como parâmetro dois ponteiros para elementos do vetor do tipo void*.

18 O valor de retorno da função será:
negativo , se o elem1 menor que elem2 Zero , se o elem1 igual a elem2 Positivo , se o elem1 maior que elem2

19 /* qsort example */ #include <stdio.h>
#include <stdlib.h> int values[] = { 40, 10, 100, 90, 20, 25 }; int compare (const void * a, const void * b){ return ( *(int*)a - *(int*)b ); } int main () { int * pItem; int n; qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) printf ("%d ",values[n]); return 0;

20 Vamos supor que no nosso problema temos um
Dado composto. Por exemplo, um aluno que tem um código e uma nota. Queremos ordenar utilizando o qsort. Mas se utilizarmos dois vetores Não vai funcionar! Exemplo: #define MAX_ALUNOS 100 int codigo[MAX_ALUNOS]; int nota[MAX_ALUNOS];

21 Se utilizarmos o qsort com o vetor o código
teremos um problema.Por exemplo, codigo[1] terá o código de um aluno e nota[1] será a nota de um outro aluno. Teremos que juntar essas duas informações em uma variável. #define MAX_ALUNOS 100 struct aluno{ int codigo, nota; }alunos[MAX_ALUNOS];

22 Quando ordenamos o vetor aluno não vamos mais
separar informações. Vamos usar o qsort: Seja n a quantidade de alunos qsort(alunos,n,sizeof(alunos[0]),compara). Vamos ordenar por código: int compara(const void *a , const void *b){ struct aluno alunoa = *(*aluno)a; struct aluno alunob = *(*aluno)b; return alunoa.codigo – alunob.codigo; }

23 Localização de um depósito
Vamos supor que exista uma rede de lanchonete em uma rede. Devemos escolher uma das lanchonetes para instalar um depósito de tal forma que o somatório das distâncias para todas as outras lanchonetes seja minimizado? Solução : Mediana


Carregar ppt "Algoritmo de Ordenação"

Apresentações semelhantes


Anúncios Google