Was wäre der einfachste Weg, um Art eine Reihe von Zeichen in C alpha?
Frage
Ich bin auf der Suche nach einem einfachen, leicht Algorithmus alphabetisch sortiert ein Array von Zeichen in C zu verstehen.
Lösung
Zeichen in C haben numerische Werte, die sein, um passieren, so dass Sie nur Ihre Charaktere wie ganze Zahlen behandeln. die C-Standard-Bibliothek enthält eine ‚qsort‘ -Funktion. Verwenden dass (man qsort
auf einem Linux-artiges System). Sie könnten Großbuchstaben in Kleinbuchstaben umwandeln müssen, um die Dinge zu vereinfachen, aber das ist trivial. Wenn Sie den quicksort Algorithmus verstehen wollen (das ist die eine, sollten Sie lernen, weil Sie wirklich verwenden werden) finden Sie unter
Andere Tipps
Wenn das Ergebnis für die Menschen bestimmt ist, ist es besser, strcoll zu verwenden. Es ist langsamer als strcmp oder strcasecmp aber es macht nicht-Englisch-Zeichen. Wenn Sie vorhaben, es zu benutzen, vergessen Sie nicht, Ihren Ort für LC_COLLATE einzustellen, d.
setlocale (LC_COLLATE, "");
Mit der qsort Methode:
#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;
}
Ich frage mich, ob Sie wirklich für einen Algorithmus oder einfach nur einen Weg, um das Problem zu lösen? Wenn letzteres, dann verwenden Sie C des qsort .
Wenn Sie eine algorith wollen, gehen Sie für Insertionsort oder Auswahl sortieren , wie sie sind sehr einfach zu verstehen
Versuchen Sie einfach Bubble Sort , dass der einfachste Sortieralgorithmus ist.
Einfach? Führen Sie eine Blase Art.
Dies ist Java und int statt verkohlen, aber man kann es leicht anpassen ...
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);
}
Das ist ziemlich einfach und asymptotisch schnellst (N ist eine Größe von 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;