1244 - Ordenação por Tamanho
Alterar o critério de ordenação para levar em conta o tamanho das strings. Apenas preste atenção que aqui precisamos de um método de ordenação estável.
Descrição
Solução
Pelo enunciado deste problema, podemos notar que o que é pedido é ordenar as palavras de acordo com o tamanho das strings e, em critério de desempate, manter a ordem original das palavras. Com isso, usar um algoritmo de ordenação como QuickSort (o padrão das bibliotecas) está fora de questão pois o QuickSort é considerado um algoritmo de ordenação instável, ou seja, um algoritmo que não mantem a ordenação relativa entre elementos que não foram comparados entre si.
Logo, para esta solução, decidimos usar um algoritmo de ordenação instável: o InsertionSort, seguindo a implementação normal, que manterá a ordenação relativa original em caso de empate sem precisar de uma estrutura de dados extra para armazenar as posições iniciais (o que poderia ser uma opção válida, mas desnecessária para a quantidade de palavras que vamos armazenar).
Vide critério de ordenação para ver como mudar o critério de ordenação de acordo com o tamanho da string.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int tam;
char palavras[100][100];
int comp(char *a, char *b)
{
return strlen(b) - strlen(a);
}
void insertionSort()
{
char aux[100];
for (int i = 1; i < tam; ++i)
{
int j = i, k = j - 1;
while (k > -1 && comp(palavras[j], palavras[k]) < 0)
{
strcpy(aux, palavras[j]);
strcpy(palavras[j], palavras[k]);
strcpy(palavras[k], aux);
--j, --k;
}
}
}
int main()
{
int N;
char frase[10000], *ptr;
scanf("%d\n", &N);
for (int k = 0; k < N; ++k)
{
scanf("%[^\n]\n", &frase);
tam = 0;
ptr = strtok(frase, " ");
while (ptr != NULL)
{
strcpy(palavras[tam++], ptr);
ptr = strtok(NULL, " ");
}
insertionSort(&palavras, tam);
printf("%s", palavras[0]);
for (int i = 1; i < tam; ++i)
{
printf(" %s", palavras[i]);
}
printf("\n");
}
return 0;
}
Last updated
Was this helpful?