Qual seria a maneira mais simples de alfa tipo uma matriz de caracteres em C?
Pergunta
Eu estou procurando um simples, fácil de entender algoritmo para ordenar alfabeticamente um array de caracteres em C.
Solução
caracteres em C têm valores numéricos que acontecem estar em ordem, assim você só trata seus personagens como números inteiros. a biblioteca padrão C inclui uma função 'qsort'. Use esse (man qsort
em um linux-like sistema). Você pode ter que converter letras maiúsculas para minúsculas para simplificar as coisas, mas isso é trivial. Se você quiser entender o algoritmo quicksort (que é o que você deve aprender, porque você vai realmente usá-lo), consulte Wikipedia .
Outras dicas
Se o resultado é destinado para os seres humanos, é melhor usar strcoll. É mais lento, em seguida, strcmp ou strcasecmp mas responde por caracteres não-inglês. Se você estiver indo para usá-lo não se esqueça de definir a sua localidade para LC_COLLATE, i.
setlocale (LC_COLLATE, "");
Use o método qsort:
#include <stdlib.h>
int char_compare (const void * a, const void * b)
{
return *(const char *)a - *(const char *)b;
}
int main(){
const char char_array[] = { 'c', 'a', 'b' };
qsort (char_array, 3, sizeof(char), char_compare);
return 0;
}
Gostaria de saber se você está realmente à procura de um algoritmo ou apenas uma maneira de resolver o problema? Neste último caso, em seguida, usar de C qsort .
Se você quiser um algorith, ir para ordenação por inserção ou Seleção tipo , como eles são muito simples de entender
Apenas tente Bubble Sort que é o mais fácil algoritmo de classificação.
Fácil? Fazer uma espécie de bolha.
Esta é java e int em vez de char, mas você pode facilmente adaptá-lo ...
int[] bubble(int a[])
{
for (int i = a.length; --i>=0; )
{
for (int j = 0; j<i; j++)
{
if (a[j] > a[j+1])
{
int T = a[j];
a[j] = a[j+1];
a[j+1] = T;
}
}
}
return(a);
}
Este é bastante simples e assintoticamente mais rápido (N é o tamanho da matriz):
const unsigned char in[N];
unsigned char out[N], *p=out;
size_t cnt[N]={0}, i, j;
for (i=0; i<COUNT; i++) cnt[in[i]]++;
for (i=0; i<256; i++) for (j=cnt[i]; j; j--) *p++=i;