Quale sarebbe il modo più semplice per ordinare in ordine alfabetico una matrice di caratteri in C?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Sto cercando un algoritmo semplice e di facile comprensione per ordinare alfabeticamente una serie di caratteri in C.

È stato utile?

Soluzione

i caratteri in C hanno valori numerici che sembrano essere in ordine, quindi tratti i tuoi caratteri come numeri interi. la libreria standard C include una funzione 'qsort'. Usa quello ( man qsort su un sistema simile a Linux). Potrebbe essere necessario convertire le lettere maiuscole in minuscole per semplificare le cose, ma è banale. Se vuoi capire l'algoritmo quicksort (è quello che dovresti imparare, perché lo userai davvero), vedi Wikipedia .

Altri suggerimenti

Se il risultato è destinato all'uomo, è meglio usare strcoll. È più lento di strcmp o strcasecmp ma tiene conto di caratteri non inglesi. Se lo utilizzerai, non dimenticare di impostare le impostazioni internazionali per LC_COLLATE, ovvero

setlocale (LC_COLLATE, " ");

Usa il metodo 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;
}

Mi chiedo se stai davvero cercando un algoritmo o solo un modo per risolvere il problema? In quest'ultimo caso, utilizzare qsort di C .

Se vuoi un algoritmo, vai a Ordinamento inserzione o Selezione per tipo , poiché sono molto semplici da capire.

Prova Bubble Sort che è l'algoritmo di ordinamento più semplice.

Facile? Fai un ordinamento a bolle.

Questo è java e int piuttosto che char, ma puoi facilmente adattarlo ...

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

Questo è piuttosto semplice e asintoticamente più veloce (N è la dimensione dell'array):

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top