Você está na página 1de 11

ORDENAO POR TROCA

Bubble Sort
Este tipo de ordenao o mais conhecido atualmente. Ele ordena o vetor fazendo
comparaes entre os elementos do vetor. Utiliza um lao for (externo) que corre o vetor
inteiro, e o lao for (interno) para fazer a comparao e, se necessrio a troca entre os
elementos.
Veja a funo contendo o algoritmo de ordenao 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:

Posio 0 1 2
contedo 2 5 1
troca 1
2 5 1
troca 2
2 5 1
troca 3
2 5 1
troca 4
2 1 5
troca 5
1 2 5
troca 6
1 2 5
troca 7
1 2 5
troca 8
1 2 5
troca 9
1 2 3
troca 10
1 2 3
troca 11
1 2 3
troca 12
1 2 3
troca 13
1 2 3
troca 14
1 2 3
contedo 1 2 3

3
9
9
9
3
3
3
3
3
3
5
5
5
4
4
4
4

4
6
6
3
9
9
9
9
9
4
4
4
4
5
5
5
5

5
8
3
6
6
6
6
6
4
9
9
9
6
6
6
6
6

6
3
8
8
8
8
8
4
6
6
6
6
9
9
7
7
7

7
4
4
4
4
4
4
8
8
8
8
7
7
7
9
8
8

8
7
7
7
7
7
7
7
7
7
7
8
8
8
8
9
9

9
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10

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

Posio
contedo
troca 1
troca 2
troca 3
troca 4
troca 5
troca 6
troca 7
troca 8
troca 9
troca 10
troca 11
troca 12
troca 13
troca 14
contedo

0 1 2 3 4 5 6 7 8 9
2 5 1 9 6 8 3 4 7 10
3 8
3 6
3 9
1 5
1 2
4 8
4 6
4 9
3 5
7 8
6 9
4 5
7 9
8 9
1 2 3 4 5 6 7 8 9 10

Fazendo o mesmo exerccio s que mudando o contedo de inteiros para caracteres, o


resultado ficaria desta forma:

Posio
contedo
troca 1
troca 2
troca 3
troca 4
troca 5
troca 6
troca 7
troca 8
troca 9
troca 10
troca 11
troca 12
troca 13
troca 14
contedo

0
B
B
B
B
B
A
A
A
A
A
A
A
A
A
A
A

1
E
E
E
E
A
B
B
B
B
B
B
B
B
B
B
B

2
A
A
A
A
E
E
E
E
E
C
C
C
C
C
C
C

3
I
I
I
C
C
C
C
C
C
E
E
E
D
D
D
D

4
F
F
C
I
I
I
I
I
D
D
D
D
E
E
E
E

E o resultado mostrando apenas as trocas ficaria:

5
H
C
F
F
F
F
F
D
I
I
I
F
F
F
F
F

6
C
H
H
H
H
H
D
F
F
F
F
I
I
G
G
G

7
D
D
D
D
D
D
H
H
H
H
G
G
G
I
H
H

8
G
G
G
G
G
G
G
G
G
G
H
H
H
H
I
I

9
J
J
J
J
J
J
J
J
J
J
J
J
J
J
J
J

Posio
contedo
troca 1
troca 2
troca 3
troca 4
troca 5
troca 6
troca 7
troca 8
troca 9
troca 10
troca 11
troca 12
troca 13
troca 14
contedo

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

Para cada troca de valores este algoritmo efetua 3 trocas dentro do lao for (interno), onde
ele:
1 Armazena o contedo de uma posio do vetor, por exemplo 1, numa varivel temporria

2 Copia o contedo da varivel 1 na varivel 2


3 Copia o contedo da varivel temporria na varivel 2.
Veja:
t = V[b-1] ;
V[b-1] = V[b] ;
V[b] = t ;
T a varivel temporria.
V[b-1] seria a posio 1.
V[b] seria a posio 2.

Desta forma ele evita que algum valor seja perdido.


No Bubble sort o nmero de comparaes sempre o mesmo pois os dois laos FOR
repetem o nmero especificado de vezes, estando a lista inicialmente ordenada ou no.
J quando falamos de trocas a melhor situao sempre ser quando o vetor j estiver
ordenado, pois no ocorrer troca nenhuma. Na pior situao quando o vetor esta
completamente ao contrrio pois ser necessrio efetuar troca em todas as posies, e o
nmero de trocas estar bem prximo do nmero de comparaes.

Exerccio:
1) Utilizando a funo bubble sort ordene um vetor que possua os seguintes nmeros:
{ 3 , 12 , 21 , 4 , 8 , 7 , 50 , 1 , 10 , 2 } e mostre quantas trocas foram efetuadas.
2) Utilizando a funo bubble sort, ordene o vetor do exerccio acima de forma
decrescente e apresente o vetor na tela.
3) Utilizando o bubble sort faa o teste de mesa mostrando a ordenao de um vetor de
caracteres com o seguinte contedo { E, C, G, A, B, I }
Bibliografia utilizada:
C Completo e Total Schildt, Hebert captulo 19 Pginas 504 at 507
Algoritmo Cormen, - Capitulo Pginas

Exerccio 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();
}

Exerccio 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();
}

Exerccio 3:
Resposta: 7 trocas no total.

Posio
contedo
troca 1
troca 2
troca 3
troca 4
troca 5
troca 6
troca 7
contedo

0 1 2 3 4 5
E C G A B I
A G
A C
A E
B G
B C
B E
C E
A B C E G I