Commit e1fcb7c9 authored by Leonardo Krambeck's avatar Leonardo Krambeck

implementa mediana3 com vetor

parent e711df99
......@@ -4,8 +4,6 @@
#include "lib_ordena.h"
#define LIMITE 1000000
double timestamp(void)
{
struct timeval tp;
......@@ -17,11 +15,12 @@ int main () {
int i, tam;
double ini, fim, soma_tempo;
/* Mude aqui o numero de iterações e nome do algoritmo */
/* Mude aqui o numero de iterações, tamanho maximo e nome do algoritmo */
int MAX_IT = 100;
int TAM_MAX = 1000000;
char *algoritmo = "quicksort_mediana3 (R)";
for ( tam=10; tam <= LIMITE; tam*=10 )
for ( tam=10; tam <= TAM_MAX; tam*=10 )
{
int *v;
v = (int*) malloc (tam * sizeof(int));
......@@ -42,7 +41,7 @@ int main () {
soma_tempo += (fim-ini);
/* imprime_vetor (v, tam);*/
/*imprime_vetor (v, tam);*/
embaralha_vetor (v,tam);
}
......@@ -51,5 +50,8 @@ int main () {
free (v);
}
printf ("\n");
return 0;
}
......@@ -174,12 +174,10 @@ void quicksort_meio (int v[], int ini, int fim)
}
/* particiona com pivo da mediana de 3 */
int particiona_mediana3 (int v[], int ini, int fim, int pivo_i)
int particiona_mediana3 (int v[], int ini, int fim, int pivo)
{
int pivo, i, j;
int i, j;
/* evita overflow */
pivo = v[pivo_i];
i = ini-1;
j = fim+1;
......@@ -200,7 +198,7 @@ int particiona_mediana3 (int v[], int ini, int fim, int pivo_i)
}
}
/* calcula a mediana entre v[ini], v[meio] e v[fim] e retorna o seu indice */
/* calcula a mediana entre v[ini], v[meio] e v[fim] */
int mediana3 (int v[], int ini, int fim)
{
int meio = ini + (fim-ini)/2;
......@@ -208,26 +206,39 @@ int mediana3 (int v[], int ini, int fim)
if (v[ini] < v[meio])
{
if (v[ini] >= v[fim])
return ini;
return v[ini];
else if (v[meio] < v[fim])
return meio;
return v[meio];
}
else
{
if (v[ini] < v[fim])
return ini;
return v[ini];
else if (v[meio] >= v[fim])
return meio;
return v[meio];
}
return fim;
return v[fim];
}
/* calcula a mediana de 3 entre v[ini], v[meio] e v[fim] usando vetor e insertion */
int mediana3_vetor (int v[], int ini, int fim)
{
int meio = ini + (fim-ini)/2;
int m[3] = {v[ini], v[meio], v[fim]};
insertionsort (m, 0, 2);
return m[1];
}
void quicksort_mediana3 (int v[], int ini, int fim)
{
if (ini < fim)
{
int pivo_i = particiona_mediana3 (v, ini, fim, mediana3(v, ini, fim));
int pivo = mediana3 (v, ini, fim);
int pivo_i = particiona_mediana3 (v, ini, fim, pivo);
quicksort_mediana3 (v, ini, pivo_i);
quicksort_mediana3 (v, pivo_i+1, fim);
}
......
......@@ -11,4 +11,3 @@ void quicksort_meio (int v[], int ini, int fim);
void quicksort_mediana3 (int v[], int ini, int fim);
void mergesort_basico (int v[], int ini, int fim);
void mergesort_melhorado (int v[], int ini, int fim);
void teste (int v[], int ini, int fim);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment