funktion bubblesort



  • Hi Stefan,

    wollte nur nachfragen, ob das mit der Array-Rückgabe eine
    allgemeine Frage war, oder sich auf dein Problem bezog?

    In dem angegebenen Bubbelsort musst du nämlich kein
    Array zurückgeben, die Änderungen bleiben
    "aussen" erhalten.

    Jockel



  • Die Funktion wollte ich dementsprechend umbauen, das man ein unsortiertes Arrayfeld an die Funktion übergibt und entsprechend ein sortiertes Feld zurückgibt. Die Angegebene Funktion benutzt wie schon bemerkt globale Variablen. 😉



  • Du musst überlegen ob du mit callbyvalue oder mit callbyreference arbeitest denn im falle callbyreference brauchst du das Array nicht zurückzugeben denn es wird direkt von der Funktion bearbeitet.

    CallByValue -> Übergabe des Wertes an eine Funktion und in der Funktion wird mit einer Wertekopie gearbeitet. Das bedeutet, die Werte werden zwar verändert aber sobald die Funktion verlassen wird sind sie auch wieder weg.
    CallByRefernce -> Übergabe der Referenz an die Funktion und die Werte werden direkt bearbeitet. Nachdem die Funktion erfolgreich ausgeführt wurde, befindet sich das Array im sortierten (solange die Funktion richtig ist) Zustand. Demnach brauchst du bei dieser Methode keine Rückgabe.

    Beachte aber bei Multithreading Applikationen muss du mit CallByRefernce aufpassen....!

    Gruss 😮



  • Wie übergibt man denn ein Array per Value ?!?

    JOckel



  • interessante frage 😉



  • gar nicht



  • Hi,

    nur sind immer noch etliche Fehler im Quellcode
    So könnte eine Lösung sein;

    #include <stdio.h>
    #include <stdlib.h>
    
    #define bool unsigned int   //in C gibt es keine bool-Typen
    #define false 0             //in C gibt es kein true oder false
    #define true 1
    void swap (int * a, int * b)   //call by reference, sonst kein Tausch
    {
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
    }
    
    void bubblesort( int* izahl, int groesse)
    {
      bool bend=false;
      int i=0;
        for(i=0;i<groesse;i++)
            if(izahl[i+1]<izahl[i])
        {
          swap(&izahl[i+1],&izahl[i]);   //call by reference
          bend=true;
        }
        if(bend)bubblesort(izahl,groesse);  //Liste unvollständig
    
    }
    
    int main()
    {
    int groesse = 7,i;
    int array[]={99,-4,12,77,33,44,3};
    bubblesort( array ,groesse);  //falscher Aufruf
    for (i=0;i<groesse;i++)
    printf("%d    ",array[i]);
    system("pause");
    }
    


  • Habs hinbekommen.

    #include <conio.h>
    #include <iostream.h>
    
    int *bubblesort(int izahlen[],int ilaenge);
    
    void main()
    {
       int ilaenge=6;
       int izahlen[6]={5,7,2,9,1,8};
       int *pzahlen=izahlen;
       pzahlen = bubblesort(izahlen,ilaenge);
       for(int i=0;i<6;i++) cout << izahlen[i] << " ";
       getch();
    }
    int *bubblesort(int izahlen[],int ilaenge)
    {
       bool bend=false;
       for(int i=0;i<ilaenge-1;i++) if(izahlen[i+1]<izahlen[i])
       {
          swap(izahlen[i+1],izahlen[i]);
    
          bend=true;
       }
       if(bend) bubblesort(izahlen,ilaenge);
       int *pzurueck=izahlen;
       return pzurueck;
    }
    


  • Ich hab auch mal'n Bubblesort geschrieben:

    void bubblesort(int arr[], int n) {
      int i=0, j, swapTmp;
      for(i; i<n-1; ++i) {
        for(j=n-1; j>i; --j) {
          if(arr[j-1]>arr[j]) {
            swapTmp=arr[j-1];
            arr[j-1]=arr[j];
            arr[j]=swapTmp;
          }
        }
      }
    }
    

    Supa, oder? Fehler bitte posten... 😉

    [ Dieser Beitrag wurde am 16.05.2003 um 17:24 Uhr von MaSTaH editiert. ]



  • Hi Stefan,

    so bestimmt nicht !!!

    Was ist swap()???
    Erhältst du die Werte wirklich (ge-)swap(-ed)??????

    Warum einen int-Pointer zurückgeben, wenn du ein Array übergibst??

    so ist das jedenfalls Müll.

    mfg
    pierre



  • @Stefan: pssst...

    void bubblesort(int izahlen[],int ilaenge)
    {
       bool bend=false;
       for(int i=1;i<ilaenge;++i) {
         if(izahlen[i-1]<izahlen[i]) {
           swap(izahlen[i-1],izahlen[i]);
           bend=true;
         }
       }
       if(bend)
        bubblesort(izahlen,ilaenge);
    }
    

    😉



  • statt

    #define bool unsigned int   //in C gibt es keine bool-Typen
    #define false 0             //in C gibt es kein true oder false
    #define true 1
    

    würde ich eher so tun:

    enum boolean{false=0,true};
    


  • Hab es jetzt glaub ich begriffen.
    Wenn ich ein Arrayfeld übergebe haben alle Änderungen im Feld globale Wirkung.
    Wenn ich einfache Variablen übergebe so haben Änderungen an den Variablenwerten nur lokale Wirkung.

    Liege ich da richtig ? 😕
    (ps:Währe froh, wenn mir jemand erklären könnte warum das so ist 😉 )



  • Habe es mir selbst durch suchen um Forum erklärt. 😃
    An die Funktion wird nicht das Array an sich übergeben, sondern nur der Zeiger auf das Array.
    richtig ? 😕



  • jo



  • @ Stefan,

    jetzt überprüf noch mal deine swap-Funktion, bzw. deren Aufruf.

    ich denke mal, dann hast du das auch soweit mit den Pointern geschnallt.

    mfg
    pierre



  • Meine Swap-Funktion sieht so aus.Logischerweise auch mit Zeigern.
    Mein Problem war das ich vorher dachte ich kann ein Arrayfeld komplett übergeben ! 🙄
    Jetzt hab ich geschnallt, das ich auch nur den Zeiger auf das Feld übergebe.
    Meine Swap Funktion läuft natürlich auch nur mit Zeigern:

    void swap(int *z1,int *z2)
    {
       int temp=*z1;
       *z1=*z2;
       *z2=temp;
    }
    

Anmelden zum Antworten