Você está na página 1de 3

/********************************************************************/

/* Projeto....: Questao6
** Programa...: questao6.out
** Programador: Carlos Alberto da Costa Barata
** Disciplina.: Projeto e Analise de Algoritmos
** =================================================================
** Comentarios: Questo 6: Considere duas constantes a e b, tais que 0<a<b.
**
Dado um vetor A[0..n] como entrada do problema, escreva um algoritmo
**
que tenha como sada uma permutao, onde:
**
1)A[0..m], esteja em ordem decrescente e A[i]<=a, para todo 0<i<m;
**
2)A[m+1..p], esteja em ordem crescente e a<A[j]<=b, para todo m<j<p;
**
3)A[p+1..n], esteja em ordem decrescente e A[k]>b, para todo p<k<=n.
**
Seu algoritmo deve ser o mais eficiente possvel (considerando a ordem
**
de complexidade). Faa a anlise de custo de seu algoritmo.
*********************************************************************/
/* ---------------------------------------------------------------- */
/*
Area de inclusao de arquivos cabecalhos
*/
/* ---------------------------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
#define n 16
/* ---------------------------------------------------------------------** Descricao: Esta funcao imprime o vetor no video.
** Entrada: vet - Vetor de inteiros que possui o coteudo a ser impresso.
**
tam - Tamanho do vetor a ser impresso.
** Saida: (Nao Existe)
** ---------------------------------------------------------------------- */
void ImprimeVetor(int vet[],int tam)
{ int i;
for (i=0;i<tam;i++)
printf("%d ",vet[i]);
}
/* -----------------------------------------------** Descricao: Troca o valor de duas variaveis.
** Entrada: x - conteudo de x.
**
y - conteudo de y.
** Saida: x - retorna o valor de y, na variavel x
**
y - retorna o valor de x, na variavel y
** ------------------------------------------------ */
void Troque (int *x, int *y)
{ int z;
z=*x;
*x=*y;
*y=z;
}
/* -------------------------------------------------------** Descricao: Particiona um vetor em duas partes.
** Entrada: vet - vetor a ser particionado.
**
inicio - inicio do vetor.
**
fim - final do vetor
** Saida: retorno a posicao do vetor que foi particionado
** -------------------------------------------------------- */
int Particao (int vet[],int pivo,int p,int r)
{ int i,j;
i=p-1;

for(j=p;j<=r;j++)
if (vet[j]<=pivo)
{ i++;
Troque(&vet[i],&vet[j]);
}
return i;
}
void Intercala(int A[],int inicio, int meio, int fim, char ordem)
{ int B[fim];
int esquerda=0, direita=0;
int i=0;
esquerda=inicio;
direita=meio+1;
for(i=inicio;i<=fim;i++)
switch (ordem)// sentido da ordenacao [C]rescente [D]ecrescente
{ case 'c':
case 'C': if(direita>fim || (esquerda<=meio && A[esquerda]<=A[direita]))
{ B[i]=A[esquerda];
esquerda++;
}
else { B[i]=A[direita];
direita++;
}
break;
case 'd':
case 'D': if(direita>fim || (esquerda<=meio && A[esquerda]>=A[direita]))
{ B[i]=A[esquerda];
esquerda++;
}
else { B[i]=A[direita];
direita++;
}
break;
}
for(i=inicio;i<=fim;i++)
A[i]=B[i];
}
void MergeSort(int vet[],int inicio, int fim, char ordem)
{ int meio;
if(inicio<fim)
{ meio=(inicio+fim)/2;
MergeSort(vet,inicio,meio,ordem);
MergeSort(vet,meio+1,fim,ordem);
Intercala(vet,inicio,meio,fim,ordem);
}
}
int main(void)
{ int A[n]={2,8,7,1,3,5,6,4,12,18,17,11,13,15,16,14};
int m,p;
int a,b;
system("cls");
do { printf("Informe um valor para a>0: ");
scanf("%d",&a);
} while(a<=0);
do { printf("Informe um valor para b, sendo b>a: ");
scanf("%d",&b);
} while(b<=a);

printf("\nVetor original: ");


ImprimeVetor(A,n);
printf("\n");
m=Particao(A,a,0,n-1);
p=Particao(A,b,m+1,n-1);
MergeSort(A,0, m,'d' );
// intervalo de 0<i<m
MergeSort(A,m+1, p,'c' ); // intervalo de m<j<p
MergeSort(A,p+1, n,'d' ); // intervalo de p<k<=n
printf("Vetor ordenado: ");
ImprimeVetor(A,n);
printf("\n\n");
system("pause");
return 0;
}

Você também pode gostar