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