Commit e711df99 authored by Leonardo Krambeck's avatar Leonardo Krambeck

implementa quicksort com mediana de 3

parent 81e92bc1
......@@ -19,7 +19,7 @@ int main () {
/* Mude aqui o numero de iterações e nome do algoritmo */
int MAX_IT = 100;
char *algoritmo = "mergesort_basico (R)";
char *algoritmo = "quicksort_mediana3 (R)";
for ( tam=10; tam <= LIMITE; tam*=10 )
{
......@@ -32,16 +32,17 @@ int main () {
soma_tempo = 0;
for (i=0; i<MAX_IT; i++)
{
/*imprime_vetor (v, tam);*/
/*printf ("\n");
imprime_vetor (v, tam);*/
ini = timestamp();
/* Mude aqui o algoritmo usado */
mergesort_basico (v,0,tam-1);
quicksort_mediana3 (v,0,tam-1);
fim = timestamp();
soma_tempo += (fim-ini);
/*imprime_vetor (v, tam);*/
/* imprime_vetor (v, tam);*/
embaralha_vetor (v,tam);
}
......
......@@ -12,7 +12,6 @@ void imprime_vetor (int v[], int tam) {
printf("%d\n",v[tam-1]);
}
/* função interna da biblioteca */
void troca (int v[], int i, int j) {
int aux;
......@@ -174,7 +173,66 @@ void quicksort_meio (int v[], int ini, int fim)
}
}
/* função interna da biblioteca */
/* particiona com pivo da mediana de 3 */
int particiona_mediana3 (int v[], int ini, int fim, int pivo_i)
{
int pivo, i, j;
/* evita overflow */
pivo = v[pivo_i];
i = ini-1;
j = fim+1;
while (1)
{
do
i++;
while ( v[i] < pivo );
do
j--;
while ( v[j] > pivo );
if ( i >= j )
return j;
troca (v, i, j);
}
}
/* calcula a mediana entre v[ini], v[meio] e v[fim] e retorna o seu indice */
int mediana3 (int v[], int ini, int fim)
{
int meio = ini + (fim-ini)/2;
if (v[ini] < v[meio])
{
if (v[ini] >= v[fim])
return ini;
else if (v[meio] < v[fim])
return meio;
}
else
{
if (v[ini] < v[fim])
return ini;
else if (v[meio] >= v[fim])
return meio;
}
return fim;
}
void quicksort_mediana3 (int v[], int ini, int fim)
{
if (ini < fim)
{
int pivo_i = particiona_mediana3 (v, ini, fim, mediana3(v, ini, fim));
quicksort_mediana3 (v, ini, pivo_i);
quicksort_mediana3 (v, pivo_i+1, fim);
}
}
void copia_vetor (int v[], int aux[], int ini, int fim)
{
int i, tam = fim-ini+1;
......@@ -295,7 +353,6 @@ void intercala_melhorado (int v[], int ini, int meio, int fim)
}
}
/* função interna da biblioteca */
/* testa se duas particoes do merge já estao ordenadas */
int esta_ordenado (int v[], int meio)
{
......@@ -305,7 +362,6 @@ int esta_ordenado (int v[], int meio)
return 0;
}
/* função interna da biblioteca */
/* testa se duas particoes do merge estão ordenadas invertidas */
int esta_invertido (int v[], int ini, int fim)
{
......
#define MAX 100
void gera_vetor_randomico (int v[], int tam);
void imprime_vetor (int v[], int tam);
void gera_vetor_em_ordem (int v[], int tam);
void gera_vetor_randomico (int v[], int tam);
void embaralha_vetor (int v[], int tam);
void imprime_vetor (int v[], int tam);
void insertionsort (int v[], int ini, int fim);
int particiona_inicio (int v[], int ini, int fim);
void quicksort_inicio (int v[], int ini, int fim);
int particiona_fim (int v[], int ini, int fim);
void quicksort_fim (int v[], int ini, int fim);
int particiona_meio (int v[], int ini, int fim);
void quicksort_meio (int v[], int ini, int fim);
void intercala_basico (int v[], int ini, int meio, int fim);
void quicksort_mediana3 (int v[], int ini, int fim);
void mergesort_basico (int v[], int ini, int fim);
void intercala_melhorado (int v[], int ini, int meio, 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