Aula 4 - Bubble Sort - Resolvido

15
ORDENAÇÃO POR TROCA Bubble Sort Este tipo de ordenação é o mais conhecido atualmente. Ele ordena o vetor fazendo comparações entre os elementos do vetor. Utiliza um laço for (externo) que corre o vetor inteiro, e o laço for (interno) para fazer a comparação e, se necessário a troca entre os elementos. Veja a função contendo o algoritmo de ordenação abaixo: #include <stdio.h> #include <stdlib.h> #define TAM 10 int bubble_Sort ( int V[TAM]) { int a, b, t; for ( a = 1; a < TAM; a++ ) { for (b = TAM-1; b >= a ; b-- ) { if ( V[b-1] > V[b] ) { t = V[b-1] ; V[b-1] = V[b] ; V[b] = t ; } } } } int main(){ int vetor[TAM] = { 2 , 5 , 1 , 9 , 6 , 8 , 3 , 4 , 7 , 10 }; int i, t;

description

Aula 5

Transcript of Aula 4 - Bubble Sort - Resolvido

ORDENAÇÃO POR TROCA

Bubble Sort

Este tipo de ordenação é o mais conhecido atualmente. Ele ordena o vetor fazendo comparações entre os elementos do vetor. Utiliza um laço for (externo) que corre o vetor inteiro, e o laço for (interno) para fazer a comparação e, se necessário a troca entre os elementos.

Veja a função contendo o algoritmo de ordenação abaixo:

#include <stdio.h>#include <stdlib.h>#define TAM 10

int bubble_Sort ( int V[TAM]) { int a, b, t;

for ( a = 1; a < TAM; a++ ) { for (b = TAM-1; b >= a ; b-- ) { if ( V[b-1] > V[b] ) { t = V[b-1] ; V[b-1] = V[b] ; V[b] = t ; } } } }

int main(){int vetor[TAM] = { 2 , 5 , 1 , 9 , 6 , 8 , 3 , 4 , 7 , 10 };

int i, t; for( i = 0 ; i < TAM ; i++ ) printf("vetor[%d] = %d\n",i,vetor[i]); // mostra o vetor antes das trocas t = bubble_Sort (vetor); printf("numero de trocas:%d\n", t); for( i= 0; i < TAM ; i++ ) printf("vetor[%d] = %d\n",i,vetor[i]); // mostra o vetor depois das trocas

}

Agora olhe como é feita a troca dentro do vetor:

Posição 0 1 2 3 4 5 6 7 8 9conteúdo 2 5 1 9 6 8 3 4 7 10troca 1 2 5 1 9 6 3 8 4 7 10troca 2 2 5 1 9 3 6 8 4 7 10troca 3 2 5 1 3 9 6 8 4 7 10troca 4 2 1 5 3 9 6 8 4 7 10troca 5 1 2 5 3 9 6 8 4 7 10troca 6 1 2 5 3 9 6 4 8 7 10troca 7 1 2 5 3 9 4 6 8 7 10troca 8 1 2 5 3 4 9 6 8 7 10troca 9 1 2 3 5 4 9 6 8 7 10troca 10 1 2 3 5 4 9 6 7 8 10troca 11 1 2 3 5 4 6 9 7 8 10troca 12 1 2 3 4 5 6 9 7 8 10troca 13 1 2 3 4 5 6 7 9 8 10troca 14 1 2 3 4 5 6 7 8 9 10conteúdo 1 2 3 4 5 6 7 8 9 10

Se limparmos a tabela e só mostrarmos os numeros que foram trocados veremos o seguinte:

Posição 0 1 2 3 4 5 6 7 8 9conteúdo 2 5 1 9 6 8 3 4 7 10

troca 1           3 8      troca 2         3 6        troca 3       3 9          troca 4   1 5              troca 5 1 2                troca 6             4 8    troca 7           4 6      troca 8         4 9        troca 9     3 5            

troca 10               7 8  troca 11           6 9      troca 12       4 5          troca 13             7 9    troca 14               8 9  

conteúdo 1 2 3 4 5 6 7 8 9 10

Fazendo o mesmo exercício só que mudando o conteúdo de inteiros para caracteres, o resultado ficaria desta forma:

Posição 0 1 2 3 4 5 6 7 8 9conteúdo B E A I F H C D G J

troca 1 B E A I F C H D G Jtroca 2 B E A I C F H D G Jtroca 3 B E A C I F H D G Jtroca 4 B A E C I F H D G Jtroca 5 A B E C I F H D G Jtroca 6 A B E C I F D H G Jtroca 7 A B E C I D F H G Jtroca 8 A B E C D I F H G Jtroca 9 A B C E D I F H G J

troca 10 A B C E D I F G H Jtroca 11 A B C E D F I G H Jtroca 12 A B C D E F I G H Jtroca 13 A B C D E F G I H Jtroca 14 A B C D E F G H I J

conteúdo A B C D E F G H I J

E o resultado mostrando apenas as trocas ficaria:

Posição 0 1 2 3 4 5 6 7 8 9conteúdo B E A I F H C D G J

troca 1           C H      troca 2         C F        troca 3       C I          troca 4   A E              troca 5 A B                troca 6             D H    troca 7           D F      troca 8         D I        troca 9     C E            

troca 10               G H  troca 11           F I      troca 12       D E          troca 13             G I    troca 14               H I  

conteúdo A B C D E F G H I J

Para cada troca de valores este algoritmo efetua 3 trocas dentro do laço for (interno), onde ele:

1° Armazena o conteúdo de uma posição do vetor, por exemplo 1, numa variável temporária

2° Copia o conteúdo da variável 1 na variável 23° Copia o conteúdo da variável temporária na variável 2.

Veja:

t = V[b-1] ; V[b-1] = V[b] ; V[b] = t ;

T é a variável temporária.V[b-1] seria a posição 1.V[b] seria a posição 2.

Desta forma ele evita que algum valor seja perdido.

No Bubble sort o número de comparações é sempre o mesmo pois os dois laços FOR repetem o número especificado de vezes, estando a lista inicialmente ordenada ou não.Já quando falamos de trocas a melhor situação sempre será quando o vetor já estiver ordenado, pois não ocorrerá troca nenhuma. Na pior situação é quando o vetor esta completamente ao contrário pois será necessário efetuar troca em todas as posições, e o número de trocas estará bem próximo do número de comparações.

Exercício:

1) Utilizando a função bubble sort ordene um vetor que possua os seguintes números: { 3 , 12 , 21 , 4 , 8 , 7 , 50 , 1 , 10 , 2 } e mostre quantas trocas foram efetuadas.

2) Utilizando a função bubble sort, ordene o vetor do exercício acima de forma decrescente e apresente o vetor na tela.

3) Utilizando o bubble sort faça o teste de mesa mostrando a ordenação de um vetor de caracteres com o seguinte conteúdo { E, C, G, A, B, I }

Bibliografia utilizada:C Completo e Total – Schildt, Hebert – capítulo 19 – Páginas 504 até 507Algoritmo – Cormen, - Capitulo – Páginas

Exercício 1: #include <stdio.h>#include <stdlib.h>#define TAM 10

int bubble_Sort( int V[TAM]) { int a, b, t, i; int ii=0;

for ( a=1;a<TAM;a++) { for (b=TAM-1;b>=a;b--) { if (V[b-1]> V[b]) { t=V[b-1]; V[b-1]=V[b]; V[b]=t; ii++; } } } printf("\nVetor Ordenado:\n"); for(i=0;i<TAM;i++) printf("vetor[%d] = %d\n",i,V[i]); printf("\ndentro da funcao de ordenacao, total de trocas %d\n\n", ii); return ii;}

int main(){int vetor[TAM] = {3,12,21,4,8,7,50,1,10,2};

int i, t;

printf("Vetor baguncado:\n"); for(i=0;i<TAM;i++) printf("vetor[%d] = %d\n",i,vetor[i]);

t = bubble_Sort (vetor); printf("\nnumero de trocas:%d\n", t); getch();}

Exercício 2:

#include <stdio.h>#include <stdlib.h>#define TAM 10

int bubble_Sort( int V[TAM]) { int a, b, t, i; int ii=0;

for ( a=1;a<TAM;a++) { for (b=TAM-1;b>=a;b--) { if (V[b-1]< V[b]) { t=V[b-1]; V[b-1]=V[b]; V[b]=t; ii++; } } } printf("\nVetor Ordenado:\n"); for(i=0;i<TAM;i++) printf("vetor[%d] = %d\n",i,V[i]); printf("\ndentro da funcao de ordenacao, total de trocas %d\n\n", ii); return ii;}

int main(){int vetor[TAM] = {3,12,21,4,8,7,50,1,10,2};

int i, t;

printf("Vetor baguncado:\n"); for(i=0;i<TAM;i++) printf("vetor[%d] = %d\n",i,vetor[i]);

t = bubble_Sort (vetor); printf("\nnumero de trocas:%d\n", t); getch();}

Exercício 3:Resposta: 7 trocas no total.

Posição 0 1 2 3 4 5conteúdo E C G A B I

troca 1     A G    troca 2   A C      troca 3 A E        troca 4       B G  troca 5     B C    troca 6   B E      troca 7     C E    

conteúdo A B C E G I