Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Quicksort/Bubblesort für alphabetische Arrays

Empfohlene Antworten

Veröffentlicht

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

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.

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

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

Danke, funktioniert alles wunderbar!

Du bist ein Genie :D

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.