StringGrid - sortieren II



  • hab mal die Sortierfunktion (BubbleSort) der FAQ bissel geändert und noch eine mit QuickSort geschrieben. Diese ist so ca. 70-90 mal schneller als der BubbleSort. Beide sortieren nur Integer-Werte.

    //---------------------------------------------------------------------------
    void __fastcall TForm1::BubbleSortColumn(TStringGrid *grid, int Column, bool Desc)
    {
      // fixe zeilen ignorieren
      int fr  = grid->FixedRows;
      int anz = grid->RowCount;
    
      // vom ende bis anfang alle zeilen durchgehen
      for (int j = anz - 1; j > fr; j--)
      {
        // vom anfang bis ende alle zeilen durchgehen
        for (int i = fr; i < j; i++)
        {
          // die zu vergleichenden werte bestimmen
          int a = StrToInt(grid->Cells[Column][i]);
          int b = StrToInt(grid->Cells[Column][i + 1]);
    
          // vergleich (aufsteigen oder absteigend)
          if (Desc ? (a > b) : (a < b))
          {
            // zeilen tauschen
            AnsiString tmp               = grid->Rows[i]->CommaText;
            grid->Rows[i]->CommaText     = grid->Rows[i + 1]->CommaText;
            grid->Rows[i + 1]->CommaText = tmp;
          }
        }
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::QuickSortColumn(TStringGrid *grid, int Column, int links, int rechts, bool Desc)
    {
      // rechte und linke grenze festlegen
      int i = links;
      int j = rechts;
    
      // den mittelwert bestimmen (sortierung aufteilen)
      int m = StrToInt(grid->Cells[Column][(int) ((links + rechts) / 2)]);
    
      do
      {
        // sortier-reihenfolge festlegen
        while (Desc ? (StrToInt(grid->Cells[Column][i]) < m) : (StrToInt(grid->Cells[Column][i]) > m)) i++;
        while (Desc ? (m < StrToInt(grid->Cells[Column][j])) : (m > StrToInt(grid->Cells[Column][j]))) j--;
    
        if (i <= j)
        {
          // zeilen tauschen
          AnsiString tmp           = grid->Rows[i]->CommaText;
          grid->Rows[i]->CommaText = grid->Rows[j]->CommaText;
          grid->Rows[j]->CommaText = tmp;
    
          i++;
          j--;
        }
      }
      while (i < j);
    
      // rekursiver aufruf
      if (links < j)  QuickSortColumn(grid, Column, links, j, Desc);
      if (i < rechts) QuickSortColumn(grid, Column, i, rechts, Desc);
    }
    //---------------------------------------------------------------------------
    
    // aufruf über:
    // eine checkbox steuert die reihenfolge
    bool desc = CheckBox1->Checked;
    
    QuickSortColumn(StringGrid1, Col, StringGrid1->FixedRows, StringGrid1->RowCount - 1, desc);
    
    BubbleSortColumn(StringGrid1, Col, desc);
    

    viel spass 🙂

    [ Dieser Beitrag wurde am 11.06.2002 um 15:43 Uhr von Jansen editiert. ]



  • Und wo sind die Kommentare? Warum nur eine Richtung?
    Warum musste der BubbleSort umgeschrieben werden?

    Wenn schon, denn schon! 😉



  • na gut, :p ich setz mich nochmal dran. zum bubblesort: naja sind ein paar zuweisungen rausgeflogen, dürften ihn aber nur extrem wenige millisekunden schneller machen. 😉



  • done!



  • Siessu, geht doch! 🙂


Anmelden zum Antworten