Schnelles Sortieren eines Datensatz-Arrays (Struct)

  • Ich bin neu in der C-Programmierung und versuche, schnell ein Array von Datensätzen zu sortieren. Ich bin nicht sicher, ob ich den Datensatz ordnungsgemäß an die Funktion schicke, aber mein Fehler ist

    Fehler: Konvertierung von "TaxRecord *" in einen nicht-Skalar Typ "TaxRecord" angefordert
    Fehler: keine Übereinstimmung für "Operator & lt;" in "* (table + ((unsigned int) (((unsigned int) left) * 104u))) & lt; Pivot"

     void qsort(TaxRecord table,int start,int finish);
    
    qsort(theEmployees[i],0,i);
    
    void qsort(TaxRecord table[],int start,int finish) {
        int left = start,
        right = finish;
        TaxRecord pivot = table[((start+finish)/2)];
        TaxRecord temp = table;
    
        while (left < right) {
            // find left candidate
            while (table[left]  < pivot)
                left++; 
            // find right candidate 
            while (table[right] > pivot)
                right--; 
            if (left <= right) {
                int temp = table[left];
                table[left] = table[right];
                table[right] = temp;
                left++;
                right--;
            } 
        } // while left < right
    
        if (start < right)
            qsort(table,start,right);
        if (left < finish)
            qsort(table,left,finish);
    }
     
    18 March 2018
    Stephen DocyTrilok Kumar
2 answers
  • 1) Ihr Funktionsprototyp stimmt nicht mit der Funktionsdeklaration überein.

     void qsort(TaxRecord table,int start,int finish);
    void qsort(TaxRecord table[],int start,int finish)
     

    2) Sie rufen die Funktion mit einem scheinbar einzelnen Arrayelement anstelle des Arrays auf.

     qsort(theEmployees[i],0,i);
     

    3) Sie versuchen, ein Array einer TaxRecord -Variablen zuzuordnen.

     TaxRecord temp = table;
     

    4) Sie versuchen, ein int temporär während des Austauschs von TaxRecord -Elementen.

     int temp = table[left];
    table[left] = table[right];
    table[right] = temp;
     

    5) Die Fehlermeldung hört sich an, als sei kein ' Ein definiertes operator< für Ihren TaxRecord -Typ.

    Mein Vorschlag: Statt Ihren Code zu korrigieren, verwenden Sie einfach die Bibliothek qsort oder std::sort, je nachdem, ob Sie dies tun ist C oder C ++.

    22 November 2011
    Blastfurnace
  • Sie haben erklärt,

     void qsort(TaxRecord table,int start,int finish);
     

    aber implementiert

     void qsort(TaxRecord table[],int start,int finish);
     

    Auch wenn TaxRecord eine Klasse / Struktur ist, müssen Sie den Operator < definieren, um sie darauf zu verwenden. Ich würde auch empfehlen, dass Sie es nicht ständig kopieren, sondern Referenzen oder Zeiger verwenden. Wenn Sie das reine C beibehalten möchten, müssen Sie der Funktion einen Funktionszeiger an eine Vergleichsfunktion wie folgt übergeben:

     void qsort(void *data,int start, int finish, int(*compare)(const void *, const void *));
     
    22 November 2011
    PeterT