Faça um programa que leia n nomes e ordene-os pelo tamanho utilizando o algoritmo selection sort

Passo 1

O enunciado pede para escrever um programa que leia um número inteiro n e, em seguida, n nomes (strings), e que os ordene em ordem crescente de tamanho, usando o algoritmo selection sort.

Passo 2

Vamos armazenar os nomes em um vetor dinâmico de ponteiros para char. Assim podemos trocar apenas os ponteiros à medida que fizermos o sort, sem mover caracteres dentro das strings.

Passo 3

Para implementar o selection sort, faremos dois loops aninhados: o externo varia a posição i de 0 a n–2; o interno busca, a partir de i+1, o índice min_idx da string de menor comprimento comparada à posição i.
Quando encontrarmos um min_idx diferente de i, trocamos os ponteiros names[i] e names[min_idx]. Isso mantém o restante da string intacto e apenas reorganiza a ordem no vetor.

Passo 4

Depois de ordenados, iteramos sobre o vetor e imprimimos cada nome em sua nova ordem.
Por fim, liberamos toda a memória alocada antes de terminar o programa.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
getchar(); // consome ‘\n’ após o número
// Aloca vetor de ponteiros para strings
char **names = malloc(n * sizeof(char*));
const int MAX_LEN = 100;

for (int i = 0; i < n; i++) {
    names[i] = malloc(MAX_LEN * sizeof(char));
    fgets(names[i], MAX_LEN, stdin);
    // Remove '\n' final, se existir
    names[i][strcspn(names[i], "\n")] = '\0';
}

// Selection sort pelo tamanho das strings
for (int i = 0; i < n - 1; i++) {
    int min_idx = i;
    for (int j = i + 1; j < n; j++) {
        if (strlen(names[j]) < strlen(names[min_idx])) {
            min_idx = j;
        }
    }
    if (min_idx != i) {
        char *temp = names[i];
        names[i] = names[min_idx];
        names[min_idx] = temp;
    }
}

// Imprime nomes ordenados
for (int i = 0; i < n; i++) {
    printf("%s\n", names[i]);
}

// Libera memória
for (int i = 0; i < n; i++) {
    free(names[i]);
}
free(names);

return 0;
}

Exercícios relacionados