diff --git a/tp3/tp3 b/tp3/tp3
index 5ed200ef4059a631b90617d1ae6bf71858e94880..8c908ef36069626952979641e37e84ab8f2e98cf 100755
Binary files a/tp3/tp3 and b/tp3/tp3 differ
diff --git a/tp3/tp3.c b/tp3/tp3.c
index 434343a2ceec21c748ea084c010a61b34ccf084a..b9b2a1aafc40b8e41d8e4bf1bdbac822c4abc5d9 100644
--- a/tp3/tp3.c
+++ b/tp3/tp3.c
@@ -23,23 +23,50 @@ void imprimir_vetor_racional(racional **vet, int tam) {
 }
 
 /* retorna um vetor de tam ponteiros para numeros racionais validos gerados aleatoriamente */
-/* retorna NULL em caso de falha                                                           */
+/* retorna NULL em caso de falha */
 racional **aleatorio_vetor_racional(int tam) {
 	racional **vet;
 	if ( !(vet = malloc(tam * sizeof(racional*))) )
 		return NULL;
 	int i;
-	for (i = 0; i < tam; i++) {
+	for (i = 0; i < tam; i++)
 		*(vet + i) = sortear_r();
-	}
 	return vet;
 }
 
+/* inverte dois ponteiros para racional */
+void inverte(racional *r1, racional *r2) {
+	racional temp = *r1;
+	*r1 = *r2;
+	*r2 = temp;
+}
+
 /* retorna um vetor de tam ponteiros para numeros racionais que apontam em ordem crescente para os 
- * racionais apontados pelo vetor recebido no parametro. Defina outras funcoes para te ajudar caso
- * ache necessario */
+ * racionais apontados pelo vetor recebido no parametro. */
+/* essa funcao eh uma implementacao do bubble sort */
 racional **ordenar_vetor_racional(racional **vet, int tam) {
-	
+	racional **ord;
+	if ( !(ord = malloc(tam * sizeof(racional*))) )
+		return NULL;
+
+	int i;
+	for (i = 0; i < tam; i++) {
+		*(ord + i) = criar_r();
+		*(ord + i) = *(vet + i);
+	}
+
+	int swaps = 1;
+	while (swaps) {
+		swaps = 0;
+		for (i = 0; i < tam-1; i++) {
+			if (menor_r(*(ord + i+1), *(ord + i))) {
+				inverte(*(ord + i+1), *(ord + i));
+				swaps++;
+			}
+		}
+	}
+
+	return ord;
 }
 
 /* libera a memoria alocada em um vetor vet de tam ponteiros para numeros racionais */
@@ -55,33 +82,32 @@ racional **liberar_vetor_racional(racional **vet, int tam) {
 }
 
 int main() {
+	/* inicializa semente randomica */
+	srand(0);
+
     racional **v, **w;
     /* v e w são vetores de ponteiros para racionais (racional *)
        alternativamente poderia ser declarado como racional *v[] */
     
     int tam;
-
-    /* inicializa semente randomica                            */
-    /* depois pode trocar para, por exemplo, srand (time (0)); */
-    srand(0);
-
     /* ler o tamanho do vetor de racionais */
     tam = ler_tamanho();
 
     /* aloca v com tam ponteiros para racional */
     v = aleatorio_vetor_racional(tam);
-    /*  lembre-se que a funcao acima retorna NULL em caso de falha */
+    /* a funcao acima retorna NULL em caso de falha */
 
     /* chama a funcao para ordenar o vetor */
     w = ordenar_vetor_racional(v, tam); 
-    /*  lembre-se que a funcao acima retorna 0 em caso de falha */
+    /* a funcao acima retorna NULL em caso de falha */
 
     /* imprime o vetor ordenado */
-    imprimir_vetor_racional(v, tam);
+	imprimir_vetor_racional(v, tam);
+    imprimir_vetor_racional(w, tam);
 
-    /* libera toda memoria alocada dinamicamente        */
-    /* nao esqueca de testar com valgrind para conferir */
+    /* libera toda memoria alocada dinamicamente */
 	v = liberar_vetor_racional(v, tam);
+	w = liberar_vetor_racional(w, tam);
 
     return 0;
 }