Sortierung alphabetisch in C unter Verwendung von strcmp
Ich versuche zu Sortieren, records (Strukturen), die durch Ihre Namen. Und ich bin mit strcmp zu tauschen, zu erkennen der alphabetischen Reihenfolge. Das tauschen funktioniert, aber nicht immer Sortieren der gesamten Liste. Es gibt immer einige Datensätze in der thier falsche alphabetische Reihenfolge.
void sort_by_name(){
printf("%d\n", counter);
int i=0, j=0;
patient *temp;
for(;j<=counter;j++){
for(;i<counter-1;i++){
if(strcmp(pRecords[i]->name, pRecords[i+1]->name) > 0){
temp = pRecords[i];
pRecords[i] = pRecords[i+1];
pRecords[i+1]=temp;
}//if loops
}//2nd for loop
}//1st for loop
}
counter-- number of records in the system.
Haben Sie versucht, schrittweise durch den code in einem debugger auf einem kleinen Datensatz? Haben Sie versucht, indem Sie einige printf-Anweisungen zur Anzeige der Werte mit zwischenwerten? Könnten Sie ein Beispiel geben, dataset, das fehlschlägt?
FYI, werden Sie wahrscheinlich wollen, "strcoll" für Alphabetisierung begründet, da die "strcmp" nur vergleicht bytes und nicht verstehen alphabetischer Reihenfolge. Siehe: pubs.opengroup.org/onlinepubs/009695399/functions/strcoll.html
FYI, werden Sie wahrscheinlich wollen, "strcoll" für Alphabetisierung begründet, da die "strcmp" nur vergleicht bytes und nicht verstehen alphabetischer Reihenfolge. Siehe: pubs.opengroup.org/onlinepubs/009695399/functions/strcoll.html
InformationsquelleAutor smooth_smoothie | 2011-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dein problem ist, dass Sie nicht re-Initialisierung
i
auf 0 jedes mal, wenn Sie beginnen, die innere Schleife.Dies ist eine relativ einfache bubblesort, wo die innere Schleife läuft über die Liste der
N
ElementeN
mal (gesteuert von der äußeren Schleife), damit Sie sortiert. Aber Ihre innere Schleife läuft über Sie einmal, dann scheint zu gehen off anderswo, über das Ende des Arrays. Das ist unwahrscheinlich, um nützliche Ergebnisse 🙂Ihre allgemeinere Frage ist: warum bist du nicht mit der Sprache Einrichtungen, um dies zu tun, speziell
qsort
? Wenn Sie versuchen, sich selbst zu erziehen auf das Sortieren, das ist in Ordnung, aber wenn Sie nur wollen, um zu Sortieren, gibt es wenig Sinn, das Rad neu erfinden möchte.Für was es Wert ist, ziehe ich den folgenden Algorithmus bubble-sort. Es Stoppt vorzeitig, wenn die Liste sortiert ist, und es sieht nicht bei bereits sortierten Elemente:
Den
didSwap
variable steuert, Wann zu beenden. Wenn Sie durchqueren den gesamten unsortierten Abschnitt ohne vertauschen, dann ist es klar, du bist fertig. Dielimit
Steuerelemente, die unsortierten Abschnitt und verringert sich allmählich, da nach jedem Durchgang gibt es eine größere, bereits sortierten Abschnitt an das Ende der Liste (die höheren Elemente Blase bis zum Ende der Liste, eine pro pass).Himadri, das ist wahr. Aber lasst uns nicht darüber hinwegtäuschen, dass der wichtige Punkt: man initialisieren muss ich zu etwas in der inneren Schleife.
Ich bin nicht versuchen zu verschleiern der Punkt, an initializing ich. Dem kann ich nur Zustimmen, wie ich geschrieben bevor. Aber, warum nicht gehen die extra Schritt und haben einen effizienteren Algorithmus durch Einstellung i=j anstelle von i=0?
ich habe versucht zu tun, qsort, aber ich konnte nicht herausfinden, wie es zu benutzen. Da pRecords ist ein struct mit string, Schwimmer/int
Mein Punkt war, dass es besser ist, zu lehren die Grundlagen und unwichtig zu lehren, die Optimierung. Manchmal, zum Beispiel in der Pädagogik, der weniger material hat eine größere Wirkung, als mehr material. "Weniger ist mehr."
InformationsquelleAutor paxdiablo
Ich denke, dass Sie versuchen, zu implementieren, bubble-sort. Der " loop count Variablen zu sein scheinen ein bisschen off.
sollte
Müssen Sie zurücksetzen, das ich nach jeder iteration der 'j' - Schleife. Und rückwärts arbeiten, um die kleinste Anzahl Blase nach vorne.
InformationsquelleAutor Himadri Choudhury