Wie sortiert ein array von Strings nach dem Alphabet (groß-und Kleinschreibung, nicht standardmäßige Sortierung)
Brauche ich eine c-Sprache-code zum Sortieren ein paar Streicher, und es sollte groß-und Kleinschreibung und für den gleichen Buchstaben in der oberen - und unteren-Fälle, die lower-case müssen kommen ersten. Zum Beispiel das Ergebnis der Sortierung für die folgenden Zeichenfolgen:
eggs
bacon
cheese
Milk
spinach
potatoes
milk
spaghetti
werden sollte:
bacon
cheese
eggs
milk
Milk
potatoes
spaghetti
spinach
Habe ich geschrieben code, sondern das Ergebnis, das ich erhalte ist:
Milk
bacon
cheese
eggs
milk
potatoes
spaghetti
spinach
Ich habe keine Ahnung, wie das zu verbessern und ich gesucht haben, eine Menge. Könnte mir jemand helfen mit diesem?
#include <stdio.h>
#include <string.h>
int main(){
char c;
char name[20][10], temp[10];
int count_name = 0;
int name_index = 0;
int i, j;
while ((c = getchar()) != EOF){
if (c == 10){
name[count_name][name_index] = '\0';
count_name++;
name_index = 0;
} else {
name[count_name][name_index] = c;
name_index++;
}
}
for(i=0; i < count_name-1 ; i++){
for(j=i+1; j< count_name; j++)
{
if(strcmp(name[i],name[j]) > 0)
{
strcpy(temp,name[i]);
strcpy(name[i],name[j]);
strcpy(name[j],temp);
}
}
}
for (i = 0; i < count_name; i++){
printf("%s\n", name[i]);
}
}
InformationsquelleAutor der Frage Brad Capehart | 2012-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Halten gleichermaßen Wörter zusammen...
Liste der Wörter, ist es oft nützlich, zur Gruppe der "gleichen" Worten zusammen (obwohl Sie unterscheiden sich in der Falle). Zum Beispiel:
Wenn Sie möchten, dass Worte angeordnet wie die erste Spalte ich drei Möglichkeiten:
strcasecmp()
kombiniert mitstrcmp()
.isalpha()
tolower()
undisupper()
.Am Ende Diskutiere ich zwei alternativen:
Mit vorhandenen library-Funktionen
Wenn es möglich ist, so zu tun, vermeiden Sie das Rad neu erfinden. In diesem Fall können wir dies mit Hilfe der POSIX-Funktion
strcasecmp()
zu sehen, wenn Sie gleich mit einem groß- /Kleinschreibung-Vergleich, und fallen zurück aufstrcmp()
wenn Sie sind.(Auf einigen Systemen, die groß- /Kleinschreibung-Vergleich-Funktion aufgerufen wird
stricmp()
oder_stricmp()
. Wenn man nicht zur Verfügung, eine Umsetzung ist unten angegeben.Vermeidung von zwei Durchgängen über die Saiten
Manchmal die vorhandenen Funktionen nicht gut genug, und Sie haben etwas anderes zu tun, um die Dinge schneller. Die folgende Funktion wird der Vergleich in etwa in der gleichen Weise in einem Arbeitsgang und ohne Verwendung von entweder
strcasecmp()
oderstrcmp()
. Aber, es behandelt alle nicht-alphabetischen Zeichen, dass Sie weniger als die Briefe.Mit diesem Vergleich für die Sortierung halten
milk
undMilk
nebeneinander, auch wenn die Liste enthältmilk-duds
.Mit einer zusammentrag-Tabelle
Hier ist ein Weg, um dynamisch erstellen Sie eine Tabelle Sortieren von einer "Konfiguration". Es dient der Veranschaulichung einer kontrastiven Technik zu ändern, wie die strings verglichen werden.
Können Sie anzeigen, wie die Buchstaben des Alphabets sind im Vergleich mit einer Art von einfache Tabelle, die beschreibt die relative Reihenfolge, die Sie wollen Buchstaben (oder einem beliebigen Zeichen außer NUL-byte):
Aus dieser Bestellung legen wir eine look-up-Tabelle, um zu sehen, wie zwei Briefe sollen miteinander vergleichen. Die folgende Funktion initialisiert die Tabelle, wenn es nicht schon zum ersten mal getan, und auch sonst führt die Tabelle look-up.
Mit diesem look-up-Tabelle, können wir nun vereinfachen die Schleife der
alphaBetize()
Vergleich-Funktion:Können wir Dinge einfacher machen?
Verwenden Sie die Tabelle Sortieren, können Sie viele verschiedene Ordnungen mit einem vereinfachten Vergleich-Funktion, wie:
Mit dieser gleichen Funktion und durch änderung des
alphaBetical
string, können Sie erreichen fast jede Bestellung, die Sie möchten (alphabetisch, rückwärts alphabetisch, Vokale vor Konsonanten, etc.). Jedoch, die Anordnung zu halten, gleichermaßen Wörter zusammen erfordert durchsetzen großgeschriebene Wörter mit Wörter in Kleinbuchstaben, und dies kann nur durch einen Vergleich zu tun, der ignoriert den Fall.Beachten Sie, dass mit der
simple_collating()
- Funktion oben und diealphaBetical
string I vorgesehen,Bacon
kommen, bevormilk
aberMars
gehen nachmilk
und vorMilk
.Wenn Sie möchten, zu Sortieren basierend auf Ihrem Gebietsschema.
Wenn Sie möchten, verwenden Sie eine Sortierreihenfolge an, die bereits definiert für Ihr Gebietsschema, können Sie das Gebietsschema aus und rufen Sie den watkiss-Vergleich-Funktion:
Nun, durch die änderung der Ländereinstellung, die Sortierung basiert auf einem standardisierten Sortierreihenfolge.
InformationsquelleAutor der Antwort jxh
Schreiben Sie eine benutzerdefinierte Vergleichsfunktion für die Sortierung.
Ersten, Blick in die Standard - strcmp Sortierung:
strcmp
Arten von ASCII-Zeichen-code; D. H., es sortiertA-Z
danna-z
also alle Kapital A-Z kommen vor jedes Wort mit einem Kleinbuchstaben:Können wir schreiben unsere eigene Vergleichsfunktion verwendet in
cmp
verwendet inqsort
ignoriert, dass Fall. Das sieht dann so aus:Werden sicher auch ändern
cmp
:Fall ignorieren-version druckt nun:
Dies ist die gleiche Ausgabe, die Sie erhalten würden, mit der POSIX-Funktion strcasecmp.
Die Funktion
mycmp
ersten vergleicht lexikographisch in der normalen Reihenfolge[a|A]-[z|Z]
. Dies bedeutet, dass Sie erhalten, wie Buchstaben Wörter zusammen, aber vielleicht hast dubacon, Bacon
so wahrscheinlich wieBacon, bacon
. Dies ist, weil qsort ist nicht ein stabiles Sortieren und 'Speck' vergleicht gleich 'Speck'.Nun, was wir wollen, ist, wenn der Vergleich 0 Ignorierung Fall (d.h., demselben Wort wie 'MILCH' und 'Milch) vergleichen Sie nun darunter Falle und die Reihenfolge umkehren:
Endgültige version gedruckt:
Leider wird dieser Ansatz unhandlich für UNICODE. Für komplexe Sortierungen, sollten Sie erwägen, ein mapping oder eine mehrstufige Sortierung mit einem stabiles Sortieren.
Für komplexe und Lage bewusst alphabetische Sortierungen berücksichtigen Unicode-Sortierungen. Als ein Beispiel, an verschiedenen Standorten, die Buchstaben alphabetisch anders:
Die default-Werte für diese Unterscheidungen sind eingefangen in die Default Unicode Collation Element Table (DUCET) , stellt eine Standard-Zuordnung für UNICODE-Sortierungen und Vergleiche von Zeichenfolgen. Sie können ändern Sie die Vorgaben zu erfassen, die Unterscheidung zwischen Wörterbuch Sortierung und Telefonbuch-Sortierung, verschiedene Standorte oder unterschiedlicher Behandlung der Fall. Die einzelnen Standort-Variationen sind aktiv verfolgt in den Unicode Common Locale Data Repository (CLDR).
Die reccomendation für multi-level-Sortierung ist in verschiedene Kategorien unterteilt:
Einem weit verbreiteten Implementierung von Unicode-Sortierungen ist in der ICU-Bibliothek. Die Standard-DUCET Sortierung für mehrere Beispiele wären:
Erkunden Sie die ICU-Bibliothek, und ändern Sie die Speicherorte und die Ziele mit der ICU Explorer
Wenn Sie wollte, zu implementieren Ihre eigene version des DUCET für kichert, können Sie die Allgemeine Methode, die in dieser Python-Skript. Es ist nicht überwältigend, aber nicht trivial.
InformationsquelleAutor der Antwort dawg
Den Schlüssel der OP-code ist die Verwendung der Funktion
strcmp()
zum vergleichen von zwei strings.So, ich werde beginnen, indem ersetzen Sie diese standard-Funktion von einem anderen, wie die folgenden:
Den letzten Zeilen komprimiert werden, auf diese Weise:
Nun, durch den Austausch
strcmp()
durchmy_strcmp()
haben Sie das gewünschte Ergebnis.In einer sort-Algorithmus ist es eine gute Idee zu denken separat die 3 wichtigsten Aspekte:
Diese Aspekte können unabhängig voneinander optimiert werden.
So, für exampmle, wenn Sie die comparisson Funktion gut eingelebt, ist der nächste Schritt der Optimierung sein könnte, zu ersetzen, die Doppel für Sortier-Algorithmus durch eine effizientere, wie quicksort.
Insbesondere die Funktion
qsort()
der standard-Bibliothek<stdlib.h>
bietet einen solchen Algorithmus, so brauchen Sie nicht zu kümmern, Programmieren Sie.Endlich, die Strategie, die Sie verwenden, um das array zu speichern Informationen könnte zu Konsequenzen in der Leistung.
Es wäre effizienter zum speichern von Zeichenfolgen wie "array von Zeigern auf char" anstelle von "array von array von char", da die Zeiger tauschen ist schneller als das austauschen von zwei ganzen arrays von chars.
Arrays von Zeigern
ZUSÄTZLICHER HINWEIS: Die drei ersten
if()
's sind eigentlich überflüssig, weil die Logik der folgenden Sätze bedeutet, das gewünschte Ergebnis in dem Fall, dass*p1
oder*p2
0 ist. Jedoch, durch das halten von diesenif()
's, der code wird besser lesbar.InformationsquelleAutor der Antwort pablo1977
Hier, wenn ich es hinbekommen, Sie wollen etwas, als würde ich wie folgt beschreiben:
Eine case insensitive Sortierung, wo Sie unter Krawatte, tie-Break-Bedingung "Kleinbuchstaben kommt zuerst" verwendet werden.
Also es ist wie:
earlier_letter_in_the_alphabet < later_letter_in_the_alphabet
ignorieren den Falllowercase < uppercase
shorter_word < wider_word
'\0'
als die niedrigste im VergleichSchritt 2, um nur getroffen werden, wenn 1 nicht unterscheiden nichts. Schritt 3 wird bereits überprüft werden, mit 1. Alle diese sind getan, Brief-by-Brief, bedeutet, dass Sie sollten Schalter auf 2, sobald Sie ein Band zwischen den entsprechenden Zeichen, nicht nur, wenn die ganzen strings auf dem Band.
Unter der Annahme, dass dies richtig war, alles, was wir jetzt tun müssen, ist, um eine Funktion schreiben, die macht dieser Vergleich für uns alle gegeben zwei strings.
Durch eine compare-Funktion, durch Konvention/Regel, sollte die Rückgabe eines negativen Wertes für die Begünstigung der erste parameter vor, negativer Wert für die Begünstigung der zweite parameter null, wenn es nicht unterscheiden kann. Nur eine zusätzliche information, die Sie wahrscheinlich bereits wissen, von der Weg Sie machen verwenden von
strcmp
.Und das ist es! Ersetzen, die
strcmp
im code mitmy_string_compare
hier setzen auch diese Definitionen, die wir gemacht haben auf der Oberseite sollte ein korrektes Ergebnis. In der Tat, es liefert das erwartete Ergebnis für das Beispiel die Eingabe in Frage stellen.Könnte man verkürzen die Definitionen natürlich, ich habe mit Ihnen lange, so dass es leichter zu verstehen, was Los ist. Ich könnte zum Beispiel Kochen Sie alles bis auf die folgenden:
Tut im wesentlichen das gleiche mit den anderen ein, können Sie je nachdem, was Sie möchten, oder noch besser, schreiben.
InformationsquelleAutor der Antwort ThoAppelsin
Ich bin zu spät zu dieser Diskussion, und haben keine bestimmte Erwartungen zu Schwan in und nehmen Sie das fabelhafte Preis, aber nicht zu sehen, eine Lösung mit Hilfe der Idiome schaute ich mich um, dachte, ich würde in Glockenspiel.
Mein Erster Gedanke beim Lesen der problem Skillung war irgendeine form von benutzerdefinierte Sortierreihenfolge, die ich im Grunde gefunden in @jxh ' s Mit einer zusammentrag-Tabelle Begriff. Ich sehe nicht ein Fall unempfindlicher als ein zentrales Konzept, nur die Spinner bestellen.
So, ich biete den folgenden code rein als eine alternative Implementierung. Es bestimmte glibc - qsort_r(3) verwendet wird - fühlt sich aber wie ein leichter Ansatz und unterstützt viele Sortieren von Sequenzen zur Laufzeit. Aber es ist leicht getestet, und ich bin sehr wahrscheinlich fehlen diverse Schwächen. Unter anderem: ich habe bezahlt, keine Besondere Aufmerksamkeit zu Unicode oder in der Welt der wide-Zeichen, im Allgemeinen, und das wirft auf ein unsigned char ist, vermeiden Sie negative array-Indizes Gefühl vermuten.
Vorherigen ist in der Nähe von code in ein separates Modul oder eine Bibliothek, aber keine eigene header-Datei (oder Eintrag in eine header-Datei). Meine eigenen test lediglich verkettet der code von oben und unten in einer Datei mit dem Namen custom_collate_sort.c, und verwendet
...um es zu kompilieren.
InformationsquelleAutor der Antwort sjnarv
Standard-Header-Dateien Erforderlich, die von dem Programm:
Hauptprogramm beginnt hier:
Benutzerdefinierte Sortierung der Tabelle wie gewünscht:
Schnelle Sortier-Algorithmus, Sie können auch die Standard-Bibliothek zur Verfügung Gestellt:
Zwei der Wichtigsten Aufgaben sind:
InformationsquelleAutor der Antwort Vineet1982