Faça um programa que leia
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.
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.
Por fim, liberamos toda a memória alocada antes de terminar o programa.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
getchar(); // consome ‘\n’ após o número
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;
}