BoubleSort Funktion arbeitet nicht richtig.



  • Hallo ich bin neu hier im Forum. Ich habe mal eine Frage zu einer Funktion, die ich in C geschrieben habe. Es handelt sich dabei um die Doublesourt Sortierung. Ich bin noch Anfänger und dies war eine Aufgabe. Warum funktioniert diese Funktion nicht richtig? Oder ich irre mich und habe irgendwo anders einen Fehler gemacht. Wäre um Hilfe sehr dankbar.

    void bubblesort1( int array[], int size) {

    int i, temp, PaarSortiert;
    do {
    PaarSortiert=1;
    for(i=0;i<size-1;i++) {
    if(array[i-1]<array[i]) {
    temp=array[i-1];
    array[i-1]=array[i];
    array[i]=temp;
    PaarSortiert = 0;
    }
    }
    } while (PaarSortiert = 0);
    }



  • nimm das hier als Gedankenstütze
    http://de.wikipedia.org/wiki/Bubblesort

    ich persönlich realisiere sowas eig. bevorzugt mit 2 for-schleifen die ineinander geschachtelt sind.



  • ... und dies hier als praktische Anleitung, wenn Du theoretisch nicht weiter kommst:
    http://ittk.falb.at/pt/unterlagen/vcppk/bubble_sort.html

    Dort wird das Array beispielsweise als Zeiger übergeben, die swap-Funktion liegt außerhalb.

    Zeige uns doch mal dein Testprogramm main(...){...}

    Hier noch eine typische C++-Umsetzung:
    http://www.ntecs.de/old-hp/s-direktnet/prog_bsp/data/c++/BubbleSort.hpp.html



  • Jetzt habe ich den Pseudocode von wikipedia fast schon abgeschrieben, dennoch zeigt der mit jetzt einfach garkeine Zahlen. Habe einen array mit 7 variablen genommen und jedem irgendeinen Wert gegeben. Der zeigt nach dem kompliieren nichts mehr. Ich finde den Fehler einfach nicht.
    Hier das komplette Programm:
    #include<stdio.h>

    void swap(int x, int y) {
    int temp;
    x = temp;
    x = y;
    y = temp;
    }

    void bubblesort1( int array[], int size) {

    int i, temp, PaarSortiert;
    do {
    PaarSortiert=0;
    for(i=1;i<=size-1;i++) {

    if(array[i]>array[i+1]) {

    swap(array[i],array[i+1]);
    PaarSortiert = 1;
    }
    }
    } while ((PaarSortiert == 1)&&(size>=1));
    }

    main() {
    int arr[7], i;
    arr[0]=4;
    arr[1]=5;
    arr[2]=19;
    arr[3]=9;
    arr[4]=4;
    arr[5]=8;
    arr[6]=13;

    bubblesort1(arr, 7);
    for(i=1;i<=7;i++) {
    printf("\n%i",arr[i-1]);
    }
    system("pause");
    }



  • Ich schreibe wie man sieht in C, bin dabei beides zu lernen und fange mit C an. Macht aber denke ich keinen großen Unterschied.



  • Folgende Schlagwörter solltest du dir nochmal ansehen:

    * lokale Variablen (in Funktionen)
    * die Verwendung von Zeigern

    dann fällt dir auf, was u.a (hab nicht weiter geguckt) falsch ist:

    void swap(int x, int y) {
    int temp;
    x = temp;
    x = y;
    y = temp;
    }
    

    p.s. wenn du code postet benutz diese "tags"

    [cpp]//mein quellcode [/cpp]
    


  • jo danke werd ich machen.



  • void swap(int *pa, int *pb)
    {
       int tmp=*pa;
       *pa=*pb;
       *pb=tmp;
    };
    

    Wie Du siehst werden hier in diesem swap klassische Zeiger aus C (Pointer) verwendet. Nur auf diese Weise werden die von Dir gewünschten Variablen getauscht, in deinem Fall nur Kopien!

    Ich hatte hier mal ein Programm geschrieben, das die Unterschiede der einzelnen Techniken nebeneinander zeigt:

    #include <iostream>
    #include <conio.h>
    using std::cout;
    using std::endl;
    
    //globale Variablen
    int a = 1; 
    int b = 2;
    
    void ausgabe()
    {
        cout << &a << ": " << a << "\t " << &b << ": " << b  << endl << endl;
    }
    
    void erfolgloser_swap( int x, int y )
    {
      cout << "Kopien auf dem Stack: " << endl;
      cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
    
      int temp = x;
      x = y;
      y = temp;
    
      cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
      cout << "swap nur lokal erfolgreich." << endl;
    }
    
    void zeiger_swap( int * x, int * y ) // C-Lösung
    {
      int temp = *x; // Inhalts-Operator // Dereferenzierungs-Operator
      *x = *y;
      *y = temp;
    }
    
    void referenzen_swap( int & x, int & y ) // C++-Lösung
    {
      int temp = x;
      x = y;
      y = temp;
    }
    
    int main()
    { 
        cout << "Ausgangssituation: " << endl;
        ausgabe();
    
        cout << "Tausch mittels std::swap(x,y): " << endl;            
        std::swap(a,b); // Methode der Wahl aus der STL
        ausgabe();
    
        cout << "Tausch mittels Zeiger: " << endl;            
        zeiger_swap(&a, &b);
        ausgabe();
    
        cout << "Tausch mittels Referenzen: " << endl;            
        referenzen_swap(a,b);
        ausgabe();
    
        cout << "Erfolgloser Tausch, da nur lokale Kopien getauscht werden." << endl;            
        erfolgloser_swap(a,b);
        ausgabe();
    
        cout << "Tausch mittels Register eax und ebx: " << endl;         
        //swap (a,b) 
        __asm("mov _b, %eax"); //AT&T Syntax bei Dev-C++ 
        __asm("mov _a, %ebx"); 
        __asm("mov %eax, _a"); 
        __asm("mov %ebx, _b"); 
        ausgabe(); 
    
        getch();
    }
    

    Vielleicht hilft Dir dies weiter.



  • Übrigens gibt es hier eine Auflistung verschieder Sortieralgos in C:
    http://de.wikibooks.org/wiki/Algorithmen_und_Datenstrukturen_in_C



  • Ok danke. Ich weiß jetzt auch warum meine eigene Funktion nicht geklappt hat. Jetzt läuft das aber.



  • Jetzt läuft das aber.

    Freut mich, dass wir Dir helfen konnten.


Anmelden zum Antworten