Zum Inhalt springen

Quicksort/Bubblesort für alphabetische Arrays


Metalmind

Empfohlene Beiträge

Moin,

es ist mir echt unangenehm so viele Threads für ein Programm zu öffnen, aber ich weiß echt nicht mehr weiter...

Ich möchte ein zweidimensionales char Array durch selbstgeschriebene Quicksort und Bubblesort-Funktionen sortieren lassen, leider funktioniert das ganze nicht wie geplant.

Mein Code:

int laenge;


void swap2(char *array1, char *array2) //tauscht String1 und String2

{

    char tmp[100];

    strcpy(tmp,array1);

    strcpy(array1,array2);

    strcpy(array2,tmp);

    free(tmp);

    return;

}


void LexBubblesort(char *array[]) //Bubblesort-Funktion für alphabetische Arrrays

{

    int j;

    int i;

    for (i=0; i < laenge - 1; i++) {

        for (j=0; j<laenge - 1; j++) {

            if (strcmp(array[j], array[j+1]) > 0) {

                swap2(array[j],array[j+1]);

            }

        }

    }

}


scmp( void *sp1, void *sp2 ) //comparator-Argument für die Quicksort-Funktion (alphabetisch)

{

    return( strcmp(*(char **)sp1, *(char **)sp2) );

}


int i;

int j;

char Woerter[100][20];   //das zu sortierende Array


int main (void)

{


    laenge=0;

    do

    {

        error = fscanf(data1,"%s",Woerter[laenge]); //Daten werden dynamisch eingelesen

        laenge++; //um die Anzahl der Datensätze zu zählen, in meinem Fall =10

    }

    while (error != EOF); //Bis die Datei am Ende ist

    laenge--; //Da der Durchlauf in dem festgestellt wird, dass die Datei zuende ist, ebenfalls mitgezählt wird
Soweit wird das Array beschrieben und die Funktionen für Bubblesort und Quicksort sind erstellt, nun möchte ich das Array in die Funktionen einsetzen (die Compilerfehler treten alle hier auf):
qsort(Woerter,laenge,sizeof(char),scmp);
oder
LexBubblesort(Woerter);

Beim Bubblesort bekomme ich eine Compilerwarnung wegen inkompatiblen Zeigertypen und beim Quicksort bekomme ich eine Compilerwarnung in Argument 4.

Nun habe ich schon einige Zeit daran rumgedoktort und komme einfach nicht darauf wo mein Fehler ist.

Kann mir dabei jemand helfen und mir sagen was ihr von meinem Code haltet? Ich bin dankbar für jeden Tipp.

Gruß und vielen lieben Dank!

Metalmind

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da sind mehrere Fehler drin.

  • free darfst du nur auf Zeiger anwenden, die du mit malloc reserviert hast.
  • Der Parametertyp von LexBubblesort passt nicht. char *array[] deklariert ein Array von Zeigern. Du brauchst einen Zeiger auf ein Array, und du musst die Länge des Arrays angeben: char(*array)[20].
  • Die Parametertypen deiner Quicksort-Vergleichsfunktion müssen const void sein.
  • Du willst doch char-Arrays der Länge 20 sortieren. Also musst du bei qsort auch diese Größe angeben, nicht sizeof(char).
  • strcmp allein liefert dir keine alphabetische Sortierung, weil damit Großbuchstaben grundsätzlich vor Kleinbuchstaben einsortiert werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke! Ich habe deine Tipps eingefügt und der Bubblesort arbeitet jetzt einwandfrei!

Der Quicksort macht noch einige Probleme, wenn ich das Array sortieren will stürzt das Programm ab. Ist Quicksort überhaupt für zweidimensionale Arrays geeignet?

Das mit strcmp dürfte kein Problem sein, da alle Wörter groß geschrieben werden.

Gruß und Danke für die schnelle Hilfe!

Metalmind

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Quicksort macht noch einige Probleme, wenn ich das Array sortieren will stürzt das Programm ab. Ist Quicksort überhaupt für zweidimensionale Arrays geeignet?
Der Cast auf (char**) ist falsch, wenn du zweidimensionale char-Arrays sortierst. Da kommen dann die Adressen der Unter-Arrays rein, und die entsprechen der Adresse des ersten Zeichen.

Mach mal ein paar Sternchen weg:

return strcmp((char*)sp1, (char*)sp2);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...