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!