Skip to content
Snippets Groups Projects
Commit 3057da1e authored by Fernando Erd's avatar Fernando Erd :ok_hand:
Browse files

Quick Sort Recursivo e Interativo

parent a1b8041b
Branches
No related tags found
No related merge requests found
#include <stdio.h>
void Troca ( int* a, int* b ) {
int t = *a;
*a = *b;
*b = t;
}
int Particao (int Vetor[], int Esquerda, int Direita) {
int Pivo = Vetor[Direita];
int i = (Esquerda - 1);
for (int j = Esquerda; j <= Direita- 1; j++)
{
if (Vetor[j] <= Pivo)
{
i++;
Troca (&Vetor[i], &Vetor[j]);
}
}
Troca (&Vetor[i + 1], &Vetor[Direita]);
return (i + 1);
}
void QuickSortRecursivo (int Vetor[], int Esquerda, int Direita) {
int pospivo;
if (Esquerda < Direita) {
pospivo = Particao(Vetor, Esquerda, Direita);
QuickSortRecursivo(Vetor,Esquerda,pospivo-1);
QuickSortRecursivo(Vetor,pospivo+1,Direita);
}
}
void QuickSortIterativo (int Vetor[], int Esquerda, int Direita) {
int Posicao;
int Pilha[ Direita - Esquerda + 1 ];
int top;
top = -1;
Pilha[ ++top ] = Esquerda;
Pilha[ ++top ] = Direita;
while ( top >= 0 )
{
Direita = Pilha[ top-- ];
Esquerda = Pilha[ top-- ];
Posicao = Particao( Vetor, Esquerda, Direita );
if ( Posicao-1 > Esquerda )
{
Pilha[ ++top ] = Esquerda;
Pilha[ ++top ] = Posicao - 1;
}
if ( Posicao+1 < Direita )
{
Pilha[ ++top ] = Posicao + 1;
Pilha[ ++top ] = Direita;
}
}
}
void printVetor( int Vetor[], int n ) {
int i;
for ( i = 0; i < n; ++i )
printf( "%d ", Vetor[i] );
}
int main() {
int Vetor[] = {4, 3, 5, 2, 1, 3, 2, 3};
int n = sizeof( Vetor ) / sizeof( *Vetor );
QuickSortRecursivo( Vetor, 0, n - 1 );
printVetor( Vetor, n );
}
#include <stdio.h>
#include <stdlib.h>
typedef struct EstruturaPilha{
int Posicao;
struct EstruturaPilha *Prox;
} EstruturaPilha;
typedef struct {
EstruturaPilha *Topo;
} TPilha;
void InicPilha (TPilha *Pilha) {
Pilha->Topo = (EstruturaPilha*) malloc (sizeof(EstruturaPilha));
Pilha->Topo->Prox = NULL;
}
int VaziaPilha (TPilha *Pilha) {
return (Pilha->Topo->Prox == NULL);
}
void Push (TPilha *Pilha,int elemento) {
EstruturaPilha *Aux;
Aux = (EstruturaPilha*) malloc (sizeof (EstruturaPilha));
Aux->Prox = Pilha->Topo;
Pilha->Topo->Posicao = elemento;
Pilha->Topo = Aux;
}
void Pop (TPilha *Pilha, int *elemento) {
EstruturaPilha *Aux;
Aux = Pilha->Topo;
Pilha->Topo = Aux->Prox;
free (Aux);
*elemento = Pilha->Topo->Posicao;
}
void QuickSort_Interativo (int *Vetor, int TAM) {
TPilha PilhaDireita, PilhaEsquerda;
int Esquerda, Direita, i, j;
InicPilha (&PilhaDireita);
InicPilha (&PilhaEsquerda);
Esquerda = 0;
Direita = TAM - 1;
Push (&PilhaDireita, Direita);
Push (&PilhaEsquerda, Esquerda);
do {
if (Direita > Esquerda) {
//Particiona (Vetor, Esquerda, Direita, &i, &j);
Push (&PilhaDireita, j);
Push (&PilhaEsquerda, Esquerda);
Esquerda = i;
} else {
Pop (&PilhaDireita, &Direita);
Pop (&PilhaEsquerda, &Esquerda);
}
} while (!VaziaPilha (&PilhaDireita));
}
main() {
int n, TAM;
}
#include <stdio.h>
#include <stdlib.h>
void Troca (int *Vetor, int i, int j) {
int aux;
aux = Vetor[i];
Vetor [i] = Vetor[j];
Vetor [j] = aux;
}
int Mediana(int *Vetor, int esq, int dir) {
int aux;
aux = (dir+esq)/2; // elem. do meio do vetor
//mediana dos 3 numeros
if ( (Vetor[esq] >= Vetor[aux]) && (Vetor[esq] <= Vetor[dir]) )
return esq;
else if ( (Vetor[esq] >= Vetor[dir]) && (Vetor[esq] <= Vetor[aux]) )
return esq;
else if ( (Vetor[dir] >= Vetor[aux]) && (Vetor[dir] <= Vetor[esq]) )
return dir;
else if ( (Vetor[dir] >= Vetor[esq]) && (Vetor[dir] <= Vetor[aux]) )
return dir;
else if ( (Vetor[aux] >= Vetor[esq]) && (Vetor[aux] <= Vetor[dir]) )
return aux;
else if ( (Vetor[aux] >= Vetor[dir]) && (Vetor[aux] <= Vetor[esq]) )
return aux;
}
int Particao (int *Vetor, int esq, int dir) {
int i,j,pivo,aux;
aux = Mediana(Vetor,esq,dir);
pivo = Vetor[aux];
printf("%d\n",pivo);
i = esq;
j = dir;
while (i < j) {
while ( (Vetor[i] <= pivo) && (i < dir) )
i++;
while (Vetor[j] > pivo)
j--;
if (i < j)
Troca(Vetor,j,i);
}
Vetor[aux] = Vetor[j];
Vetor[j] = pivo;
return j;
}
void QuickSortRecursivo(int *Vetor, int esq, int dir) {
int pospivo;
if (esq < dir) {
pospivo = Particao(Vetor, esq, dir);
QuickSortRecursivo(Vetor,esq,pospivo-1);
QuickSortRecursivo(Vetor,pospivo+1,dir);
}
}
int main() {
int i;
int vetor[9];
printf("Vetor desordenado: \n");
for (i=0; i<9; i++) {
vetor[i] = rand() % 20;
printf("%d ",vetor[i]);
}
printf("\n");
QuickSortRecursivo(vetor,0,8);
printf("Vetor ordenado:\n");
for (i=0; i<9; i++)
printf("%d ",vetor[i]);
printf("\n");
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment