Array aufsteigend sortieren



  • Hey, ich hab die Forensuche benutzt, da aber niemand ein Array so sortiert hat wie ich es vor habe, bzw. ich keinerlei solcher Beiträge gefunden habe, hoffe ich nun hier Hilfe zu finden.

    Also, zuerst meine Aufgabenstellung:
    Ich muss ein Feld aus N zufälligen ganzen Zahlen sortieren.
    Dabei muss ich das Array durchlaufen und die Position j1 des kleinsten Schlüssels von a[0] bis a[N] ermitteln und a[0] dann mit a[j1] tauschen, danach a[2] bis a[N] durchlaufen und die Position a[j2] des kleinsten Schlüssel mit a[2] tauschen usw, bis das Array von Anfang bis Ende aufsteigend sortiert ist.

    Hier nun meine Implementierung:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define N 10                            /* Wiederholungszahl im Hauptprogramm */
    
    int sortieren (int array[N]);
    
    int main(int argc, char *argv[])
    {
        int array[N];
        srand(time(0));
        int i;
        for (i = 0; i < N; i++)             /* Array  mit Zufallszahlen */
        {                                   /* initialisieren           */
            array[i] = rand()%100;
        }
    
        int k;
        for (k = 0; k < N; k++)                        /* Array ausgeben */
        {
            printf("unsortiert:\t%d\n", array[k]);
        }
    
        int sortieren(int array[N]);                   /* Array sortieren */
    
        int x;
        for (x = 0; x < N; x++)                        /* Array ausgeben */
        {
            printf("sortiert:\t%d\n", array[x]);
        }
    
        system("PAUSE");
        return(1);
    }
    
    int sortieren (int array[N])
    {
          int k;
          int i;
          int temp;
          while (k < N) {
                for (i = 0; i < N - 1; i++)
                {
                    if (array[i] > array[i+1]) {
                             temp = array[i];
                             array[i] = array[i+1];
                             array[i+1] = temp;
                    }
                }
                k++;
          }
          return array;
    }
    

    Ich suche das Problem immernoch, aber ich hoffe hier können mir hilfreiche Tipps diesbezüglich gegeben werden.
    Als Ausgabe bekomme ich einfach wieder das unsortierte Array, ich denke ich habe in meiner Funktion irgend einen Fehler bezogen auf Pointer oder sowas.
    Kenne mich da aber noch nicht so gut aus, vllt kann mir wer weiterhelfen.

    Gruß tomi



  • sach mal woher bekommt eigentlich in z.39 "int k" seinen initialisierungs wert?

    lg lolo



  • huch

    z.25 sortieren(array); statt int sortieren(int array[N]);
    z.7 void sortieren(int *array); statt int sortieren (int array[N]);
    z.34 return 0; statt return(1);
    z.37 void sortieren(int *array){ statt int sortieren (int array[N]){
    z.53 "return array;" entfernen

    lg lolo



  • ja hast recht, hab ich nachträglich noch verändert ohne zu testen 🙄
    sieht jetzt so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define N 10                            /* Wiederholungszahl im Hauptprogramm */
    
    int sortieren (int array[N]);
    
    int main(int argc, char *argv[])
    {
        int array[N];
        srand(time(0));
        int i;
        for (i = 0; i < N; i++)             /* Array  mit Zufallszahlen */
        {                                   /* initialisieren           */
            array[i] = rand()%100;
        }
    
        int k;
        for (k = 0; k < N; k++)                        /* Array ausgeben */
        {
            printf("unsortiert:\t%d\n", array[k]);
        }
    
        int sortieren(int array[N]);                   /* Array sortieren */
    
        int x;
        for (x = 0; x < N; x++)                        /* Array ausgeben */
        {
            printf("sortiert:\t%d\n", array[x]);
        }
    
        system("PAUSE");
        return(1);
    }
    
    int sortieren (int array[N])
    {
          int k;
          int i;
          int min;
          for(k = 0; k < N;k++) {
                //min = 0;
                while ( i < N )
                {
                    if (array[i] < min) {
                            min = array[i];
                            array[i] = array[i+1];
                    }
                }
          }
          return array;
    }
    

    Bekomme von dev-c++ jetzt aber nen error in Zeile 52:
    "[Warning] return makes integer from poiner without a cast"
    Ich wusste dass ich Probleme mit Pointern bekomme..^^
    Ich will die Methode aber definitiv so ausgelagert lassen, will das mal so hinbekommen.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define N 2                            /* Wiederholungszahl im Hauptprogramm */
    
    void sortieren (int *array);
    
    int main(int argc, char *argv[])
    {
        int array[N];
        srand(time(0));
        int i;
        for (i = 0; i < N; i++)             /* Array  mit Zufallszahlen */
        {                                   /* initialisieren           */
            array[i] = rand()%100;
        }
    
        int k;
        for (k = 0; k < N; k++)                        /* Array ausgeben */
        {
            printf("unsortiert:\t%d\n", array[k]);
        }
    
        sortieren(array);                   /* Array sortieren */
    
        int x;
        for (x = 0; x < N; x++)                        /* Array ausgeben */
        {
            printf("sortiert:\t%d\n", array[x]);
        }
    
        return 0;
    }
    
    void sortieren (int *array)
    {
          int i;
          int temp;
          int swap;
          do{
    			swap = 0;
                for (i = 0; i < N - 1; i++){
                    if (array[i] > array[i+1]) {
                             temp = array[i];
                             array[i] = array[i+1];
                             array[i+1] = temp;
                             swap=1;
                    }
                }
          }while(swap);
    }
    

    so hab ichs jetzt mal versucht 🙂

    lg lolo



  • Hey, danke, das funzt.
    Kannst du mir vielleicht noch sagen, warum die Funktion sortieren void als Rückgabewert hat?
    Ich muss ja eigentlich ein Array zurückgeben oder?
    Kenne mich nur nen bisschen in Java-Programmierung aus und daher noch viele Fehler..
    Ne andere Frage, wäre:
    Warum kann ich sortieren(array) machen, bekomme dann aber in meiner Funktion nen Pointer auf das Array, dass ich übergebe?

    void sortieren (int *array)
    

    Btw. mit welchem Compiler kompiliert ihr euren Code, finde dev-c++ nicht so optimal, ich mags lieber wenn der code besser erkennbar gehighlighted ist, so wie in eclipse.
    Da bekomm ich den C-Compiler aber irgendwie nicht zum laufen 🙄



  • Tomi_goes_C schrieb:

    Btw. mit welchem Compiler kompiliert ihr euren Code, finde dev-c++ nicht so optimal, ich mags lieber wenn der code besser erkennbar gehighlighted ist, so wie in eclipse.
    Da bekomm ich den C-Compiler aber irgendwie nicht zum laufen 🙄

    schau dir mal easyeclipse an, das funktioniert eigentlich immer out of the box
    http://www.easyeclipse.org/site/distributions/index.html

    Tomi_goes_C schrieb:

    Kannst du mir vielleicht noch sagen, warum die Funktion sortieren void als Rückgabewert hat?

    weil du einen zeiger (referenz) übergibst. wenn du in java einer function ein object übergibst, wird es ja auch als referenz übergeben, und wenn du den wert einer variablen dieses objects veränderst bleibt die veränderung ja auch nach verlassen der function erhalten.

    arrays kann man super als pointer betrachten mit dem kleinen aber feinen unterschied das man dem zeiger kein neuen wert zuweisen kann

    lg lolo



  • Hmm. Ist das etwa Bubblesort? Nimm lieber Quicksort, entweder man: qsort oder selbtgestrickt (auch kaum schwieriger).
    🙂



  • mngbd schrieb:

    Hmm. Ist das etwa Bubblesort? Nimm lieber Quicksort, entweder man: qsort oder selbtgestrickt (auch kaum schwieriger).
    🙂

    ich denke das sollte zu lehr und übungszwecken gemacht werden, dachte bubblesort ist das was an seinen source mit der geringsten veränderung dran paßt, natürlich wären deine vorschläge schneller (besser) aber wer weiß evtl. hatten sie noch keine recurison und dann wirds mit quicksort schon schwer... 😉

    lg lolo



  • noobLolo schrieb:

    mngbd schrieb:

    Hmm. Ist das etwa Bubblesort? Nimm lieber Quicksort, entweder man: qsort oder selbtgestrickt (auch kaum schwieriger).
    🙂

    ich denke das sollte zu lehr und übungszwecken gemacht werden, dachte bubblesort ist das was an seinen source mit der geringsten veränderung dran paßt, natürlich wären deine vorschläge schneller (besser) aber wer weiß evtl. hatten sie noch keine recurison und dann wirds mit quicksort schon schwer... 😉

    Schneller sicher, was ist schon besser? Das O(n*n) wird wohl bei kleinen Arrays kaum ins Gewicht fallen. Andererseits ist Bubblesort so dumm, dass es sogar Wikepedia weiss. Vielleicht findet jemand eine nette Visualisierung auf irgendeiner Webseite, imo will man nicht mehr von Bubblesort reden, wenn man den einmal bei der Arbeit beobachtet hat.
    🙂



  • Sorts sind ein altes Thema der Programmierung. Da nimmt man für kleine Aufgaben irgendeinen Algorithmus wie z.B. Bubbelsort. Für das Sortieren grösserer Aufgaben oder ganzer Tabellen nimmt man etwas anderes fertiges. Ist das eine Übungsaufgabe? Kann man nicht viel dran lernen!



  • Ich dachte, das wär' Selectionsort?



  • wxSkip schrieb:

    Ich dachte, das wär' Selectionsort?

    Ist völlig egal, man nimmt einfach etwas vorhandenes brauchbares. Erst wenn die Wahl auf irgendwelche Grenzen - Performance oder Speicherbedarf - stösst, sucht man etwas anderes. An diesem Thema haben sich schon viele schlaue Leute ausgetobt!



  • mngbd schrieb:

    Vielleicht findet jemand eine nette Visualisierung auf irgendeiner Webseite, imo will man nicht mehr von Bubblesort reden, wenn man den einmal bei der Arbeit beobachtet hat.
    🙂

    http://www.sorting-algorithms.com/ ist für alle Sortieralgorithmen gut, es gibt eine Bubblesort-Website, wo tatsächlich Luftblasen animiert werden, aber es sind nur 5 und man sieht es nicht ganz so deutlich.


Anmelden zum Antworten