Buscar

Resolucao HeapSort

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 250
//verifica se a string possui todos os caracteres contidos na chave
other
int verificaContido(char palavra[], char chave[]){
 int contido = 0; 
 for(int i=0; i<strlen(palavra); i++){
 for(int j=0; j<strlen(chave); j++){
 if(palavra[i] == chave[j]){
 contido++;
 break;
 }
 }
 }
 if(contido == strlen(palavra))
 return 0;
 else
 return 1;
}
//retorna o valor do indice de uma letra
int indexLetra(char letra, char chave[]){
 int i=0;
 while(chave[i]){
 if(letra == chave[i])
 return i;
 i++;
 }
 return i;
}
//retorna a prioridade de cada string
int prioridadePalavra(char palavra1[], char palavra2[], char chave[]){
 int i=0, indicePalavra1, indicePalavra2;
 while(palavra1[i] && palavra2[i]){
 if(palavra1[i] == palavra2[i])
 i++;
 else{
 indicePalavra1 = indexLetra(palavra1[i], chave);
 indicePalavra2 = indexLetra(palavra2[i], chave);
 if(indicePalavra1 < indicePalavra2)
 return 1;
 else
 return 0;
 }
 }
 if(strlen(palavra1) <= strlen(palavra2))
 return 1;
 else
 return 0;
}
//troca duas strings de posição
void troca(char **vetor, int a, int b){
 char *temp = vetor[a];
 vetor[a] = vetor[b];
 vetor[b] = temp;
}
//função auxiliar da heapsort que ordena em uma arvore binaria as palavras
void heapify(char **vetor, char *chave, int i, int n){
 int esquerda = 2*i+1, direita = 2*i+2, maximo = i;
 if(esquerda<=n && prioridadePalavra(vetor[i], vetor[esquerda], chave)){
 maximo =esquerda;
 }
 if(direita<=n && prioridadePalavra(vetor[maximo], vetor[direita], chave)){
 maximo = direita;
 }
 if(maximo != i){
 troca(vetor, maximo, i);
 heapify(vetor, chave, maximo, n);
 }
}
//funcao heapsort
char **heapsort(char **vetor, char *chave, int n){
 char **novoVetor = malloc(n*sizeof(char*));
 for(int i=0; i<n; i++)
 novoVetor[i] = malloc(MAX*sizeof(char));
 
 
 for(int i=n/2; i>=0; i--){
 heapify(vetor, chave, i, n);
 }
 for(int i=n; i>-1; i--){
 novoVetor[i] = vetor[0];
 vetor[0] = vetor[i];
 heapify(vetor, chave, 0, i);
 }
 return novoVetor;
}
int main(){
 
 int n, s;
 char **vetorPalavras, *chave;
 scanf("%i", &n);
 scanf("%i", &s); 
 chave = malloc(s*sizeof(char));
 vetorPalavras = malloc(n*sizeof(char*));
 for(int i=0; i<n; i++){
 vetorPalavras[i] = malloc(MAX*sizeof(char)); 
 }
 scanf("%s", chave);
 for(int i=0; i<n; i++){
 scanf("%s", vetorPalavras[i]);
 if(verificaContido(vetorPalavras[i], chave)){
 printf("A palavra %s eh invalida\n", vetorPalavras[i]);
 return 0;
 }
 }
 vetorPalavras = heapsort(vetorPalavras, chave, n-1);
 for(int i=0; i<n; i++){
 if(i == n-1)
 printf("%s", vetorPalavras[i]);
 else
 printf("%s ", vetorPalavras[i]);
 }
 for(int i=0; i<n; i++){
 free(vetorPalavras[i]);
 }
 free(vetorPalavras);
 free(chave);
 return 0;
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais