Quel serait le moyen le plus simple de trier par alpha un tableau de caractères en C?

StackOverflow https://stackoverflow.com/questions/122649

  •  02-07-2019
  •  | 
  •  

Question

Je recherche un algorithme simple et facile à comprendre pour trier par ordre alphabétique un tableau de caractères en C.

Était-ce utile?

La solution

Les caractères

en C ont des valeurs numériques qui se trouvent dans l’ordre, vous devez donc traiter vos caractères comme des entiers. la bibliothèque standard C comprend une fonction 'qsort'. Utilisez cela ( man qsort sur un système de type Linux). Vous devrez peut-être convertir les lettres majuscules en minuscules pour simplifier les choses, mais c'est trivial. Si vous voulez comprendre l’algorithme quicksort (c’est celui que vous devriez apprendre, car vous allez vraiment l’utiliser), voir Wikipedia .

Autres conseils

Si le résultat est destiné aux humains, il est préférable d’utiliser strcoll. Il est plus lent que strcmp ou strcasecmp mais il prend en compte les caractères non anglais. Si vous comptez l'utiliser, n'oubliez pas de définir vos paramètres régionaux pour LC_COLLATE, c'est-à-dire.

setlocale (LC_COLLATE, "");

Utilisez la méthode 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;
}

Je me demande si vous cherchez vraiment un algorithme ou juste un moyen de résoudre le problème? Si tel est le cas, utilisez le le rapport qsort de C .

Si vous voulez un algorithme, optez pour le le tri par insertion ou Tri par sélection , car ils sont très simples à comprendre.

Il suffit d’essayer le Bubble Sort , qui est l’algorithme de tri le plus simple.

Facile? Faites une sorte de bulle.

Ceci est java et int plutôt que char, mais vous pouvez facilement l'adapter ...

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);
    }

C'est assez simple et asymptotiquement le plus rapide (N est la taille du tableau):

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top