Zweites(Zeiger?) Array sortieren



  • Moin Leute,
    Ich brauche ein Array, das ich mit Bubblesort sortieren möchte, dabei darf ich allerdings nicht das original-Array sortieren.
    Ich poste hier mal folgende Funktion von einer Website:

    void bubblesort(int *array, int length)
     {
         int i, j;
         for (i = 0; i < length; ++i) {
             for (j = 0; j < length - i - 1; ++j) {
     	    if (array[j] > array[j + 1]) {
     		int tmp = array[j];
     		array[j] = array[j + 1];
     		array[j + 1] = tmp;
     	    }
           }    
         }
     }
    
    int numArray [100];
    

    Das bedeutet, dass ich bei *array ein anderes, gleiches Array einsetzen muss und ich habe irgendwo gelesen, dass dies am besten mit einem Zeiger auf numArray funktioniert.
    Könnte mir bitte jemand erklären wie das dann funktioniert?

    Danke und Gruß
    Metalmind


  • Mod

    Du machst ein neues Array der Länge length mittels malloc . Du kopierst die Elemente aus dem alten Array in das neue (einzeln oder mit memcpy ). Du sortierst das neue Array. Du lässt den Zeiger auf das neue Array zeigen. Fertig.



  • Danke, ich habe mir die Funktion malloc durchgelesen.

    Korrigiere mich bitte wenn ich etwas falsch (oder garnicht) verstanden habe:

    numArray2 = (int *) malloc(100);
    
    for(i=0;i<100;i++){
    numArray2[i]=numArray[i];
    }
    

  • Mod

    So muss das heißen, falls du 100 ints möchtest:

    numArray2 = (int *) malloc(100*sizeof(int));
    

    Den Cast kann man übrigens auch weglassen.

    Aber warum immer diese magische 100? Du weißt doch schon, dass du length Elemente benötigst und nicht 100!



  • SeppJ schrieb:

    Den Cast kann man übrigens auch weglassen.

    Sorry, aber was ist der "Cast"?

    SeppJ schrieb:

    Du weißt doch schon, dass du length Elemente benötigst und nicht 100!

    Bisher habeich leider noch keine Funktion zustande bekommen die mir ausgibt wie viele Datensätze ich habe, das heißt zurzeit weiß ich die Anzahl nur weil ich per Hand nachgezählt habe.



  • Cast "(int*)" bedeutet soviel wie explizite Typkonvertierung.

    Wieviele Elemente in deinem Array vorhanden sind, musst du dir entweder vorher in einer extra Variablen merken, oder du kennzeichnest das letzte Element in dem Array mit einem Wert, welcher nicht vorkommen darf, also zB -1, wenn klar ist, dass keine negativen Werte vorkommen.



  • Ich habe jetzt eine Variable "laenge", in der die Anzahl der Datensätze gespeichert ist, die Funktion müsste dann also:

    numArray2 = (int) malloc(laenge*sizeof(int));	
    
    for(i=0;i<100;i++){
    numArray2[i]=numArray[i];
    }
    

    heißen, ist das richtig?

    Wenn ja würde mich das ein großes Stück weiterbringen! 🙂



  • statt

    for(i=0;i<100;i++){
    

    lieber

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

    Das sollte dann so passen.



  • Und wieder was übersehen, danke für die Hilfe 😉



  • Ich habe jetzt einen Testlauf gemacht, bekomme aber eine Fehlermeldung:
    "numArray2 undeclared".
    Muss ich das zu erzeugende Array nun noch vor der main-Funktion deklarieren?
    Wäre das dann "int numArray2" oder "int numArray2[]" oder wie müsste das dann aussehen?


  • Mod

    Metalmind01 schrieb:

    Ich habe jetzt einen Testlauf gemacht, bekomme aber eine Fehlermeldung:
    "numArray2 undeclared".
    Muss ich das zu erzeugende Array nun noch vor der main-Funktion deklarieren?
    Wäre das dann "int numArray2" oder "int numArray2[]" oder wie müsste das dann aussehen?

    Code herzeigen!



  • void Bubblesort(int *array)    //Bubblesort-Funktion
    {
        int i;
        int j;
        int laenge;
        for (i=0;i<laenge;++i) {
            for (j=0;j<laenge-i-1;++j) {
     	    if (array[j]>array[j+1]) {
     	        int tmp = array[j];
     		array[j] = array[j+1];
     		array[j+1] = tmp;
                }
            }
        }
    }
    
    int laenge;    //Anzahl der Datensätze, die in numArray gespeichert werden
    int numArray[100];
    
    int main (void)
    {
    
        laenge=10;    //zum Beispiel, wird eigendlich durch eine weitere Funktion ermittelt
    
        numArray2 = (int) malloc(laenge*sizeof(int));   //Zweites Array der Länge "laenge" erstellen
        for(i=0;i<laenge;i++){                         //und dynamisch mit dem ersten bespeichern
            numArray2[i]=numArray[i];
        }
    

    Mir geht es jetzt hauptsächlich um den Teil, in dem das Zweite Array erzeugt werden soll, hier bekomme ich den besagten Fehler, dass numArray2 nicht deklariert wurde.


  • Mod

    Es wurde ja auch nirgends deklariert!

    int *numArray2 = (int*) malloc(laenge*sizeof(int));
    


  • Der Fehler in der Zeile

    numArray2[i]=numArray[i];
    

    wird jetzt durch die Meldung:
    "error: subscripted value is neither array nor pointer" ersetzt, wobei numArray eindeutig ein funktionierendes Array ist, es muss also an numArray2 liegen.



  • Habe es schon selbst gelöst, nochmal Danke an alle die mir geholfen haben!


Log in to reply