| Autor | 
Beitrag | 
 
Do0mJump3R 
Hält's aus hier
 
Beiträge: 10 
 
 
 
 | 
Verfasst: Mi 06.10.10 17:38 
 
Hallo zusammen,
 
hab folgendes problem:
 möchte ein StringGrid so sortieren, dass es mit dem kleinsten (negativen) Wert beginnt.
 Bin schon soweit gekommen, dass ich die SG nach der 2. Spalte sortiert habe, jedoch sind pos. als auch neg. Werte durcheinander.
 Siehe hier:
  
Hat eventuell jemand einen kleinen Tipp für mich wie ich dieses Problem lösen könnte?
 Habe den Sortieralgorithmus von hier:  www.swissdelphicente.../showcode.php?id=423
Vielen Dank schon im Vorraus!!!
 Greez
 Do0mJump3R
 Moderiert von  Narses: Bild als Anhang hochgeladen. 
Einloggen, um Attachments anzusehen!
 
 
 | 
 
 |  
Xion 
        
   
Beiträge: 1952 
Erhaltene Danke: 128 
 
Windows XP 
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse),  C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci) 
 | 
Verfasst: Mi 06.10.10 22:59 
 
Also warum nach dem Sortieralgorithmus das Chaos von dem Screenshot rauskommen sollte ist mir unklar. 
 
Das sortieren über eine StringList hat natürlich den Nachteil, dass "-" > "1" ist, also kommen die negativen Zahlen alle ans Ende.
 Ich empfehle dir einen BubbleSort Algorithmus über ein record mit 2 Werten.
 		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4:
  				 | 									  type TSortItem=record     Key: extended;          Param: integer;       end;					 				 | 			 		 	  
Davon ein array, dort fügst du deine Zellen ein (ohne %-Zeichen) und sortierst es z.B. mit BubbleSort.
 Den Bubblesort kriegst du als Pseudocode von hier:
 de.wikipedia.org/wiki/Bubblesort 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
 
 | 
 
 |  
Do0mJump3R   
Hält's aus hier
 
Beiträge: 10 
 
 
 
 | 
Verfasst: Do 07.10.10 00:16 
 
Hallo Xion, 
 
vielen Dank für deine Antwort, habe auch schon einen Teil umgesetzt, leider ohne Erfolg.
 Anbei meinen bisherigen Quelltext, vllcht bin ich einfach zu doof den Fehler zu finden?!?
 																	1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
  				 | 									procedure TForm4.BubbleSort( A : TStringGrid ); var  n, i: Integer;  vertauscht: boolean; begin   n := A.RowCount;   repeat     vertauscht := false;     for i := 1 to n - 1 do begin       if A.Cells[ 2,i ] > A.Cells[ 2, i + 1 ] then begin         ExchangeStringGridRows(A, i, i + 1);         vertauscht := true;       end;     end;     n := n - 1;   until (vertauscht = True) and (n > 1); end;
  procedure TForm4.ExchangeStringGridRows(const AGrid: TStringGrid; Row1, Row2: Integer); var   Temp: TStrings; begin   Temp:=TStringList.Create;   try     Temp.Assign(AGrid.Rows[Row1]);     AGrid.Rows[Row1].Assign(AGrid.Rows[Row2]);     AGrid.Rows[Row2].Assign(Temp);   finally     Temp.Free;   end; end;					 				 | 			 		 	  
Greez Do0mJump3R  
 
 | 
 
 |  
bummi 
        
 
Beiträge: 1248 
Erhaltene Danke: 187 
 
XP - Server 2008R2 
D2 - Delphi XE 
 | 
Verfasst: Do 07.10.10 08:12 
 
davon ausgehend daß in Deiner Spalte nur Zahlen sind, sollte das hier funtionieren, ansonten mußt Du anpassen und "Nicht Zahlen" gesondert behandeln, Beispiel QuickSort2
 																	1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92:
  				 | 									procedure QuickSort(AGrid: TStringGrid;Spalte:Integer);
    procedure QSort(LoIndex, HiIndex: Integer);   var     Lo, Hi: Integer;     Pivot: Double;     Swap: TStringList;     f1,f2:Double;   begin     Swap := TStringList.Create;     try         if TryStrToFloat(AGrid.Cells[ Spalte,(LoIndex + HiIndex) div 2 ],Pivot) then         begin                             Lo := LoIndex;               Hi := HiIndex;               repeat                 while TryStrToFloat(AGrid.Cells[ Spalte,lo],f1) and (f1 < Pivot) do Inc(Lo);                 while TryStrToFloat(AGrid.Cells[ Spalte,hi],f2) and (f2 > Pivot) do Dec(Hi);                 if Lo <= Hi then                 begin                   Swap.Assign (AGrid.Rows[lo]);                   AGrid.Rows[lo].Assign(AGrid.Rows[hi]);                   AGrid.Rows[hi].Assign(Swap);                   Inc(Lo);                   Dec(Hi);                 end;               until Lo > Hi;                             if LoIndex < Hi then QSort(LoIndex, Hi);                             if Lo < HiIndex then QSort(Lo, HiIndex);         end;     finally       Swap.Free;     end;   end; begin   QSort(0, AGrid.RowCount - 1); end;
 
 
 
  procedure QuickSort2(AGrid: TStringGrid;Spalte:Integer);
    Function GetFloatCompare(const s:String;var F:Double):Boolean;     begin        if not TryStrToFloat(s,f) then f := - MaxInt;        Result := true;     end;   procedure QSort(LoIndex, HiIndex: Integer);   var     Lo, Hi: Integer;     Pivot: Double;     Swap: TStringList;     f1,f2:Double;   begin     Swap := TStringList.Create;     try          GetFloatCompare(AGrid.Cells[ Spalte,(LoIndex + HiIndex) div 2 ],Pivot);         begin                             Lo := LoIndex;               Hi := HiIndex;               repeat                 while GetFloatCompare(AGrid.Cells[ Spalte,lo],f1) and (f1 < Pivot) do Inc(Lo);                 while GetFloatCompare(AGrid.Cells[ Spalte,hi],f2) and (f2 > Pivot) do Dec(Hi);                 if Lo <= Hi then                 begin                   Swap.Assign (AGrid.Rows[lo]);                   AGrid.Rows[lo].Assign(AGrid.Rows[hi]);                   AGrid.Rows[hi].Assign(Swap);                   Inc(Lo);                   Dec(Hi);                 end;               until Lo > Hi;                             if LoIndex < Hi then QSort(LoIndex, Hi);                             if Lo < HiIndex then QSort(Lo, HiIndex);         end;     finally       Swap.Free;     end;   end; begin   QSort(0, AGrid.RowCount - 1); end;					 				 | 			 		 	   
 
 | 
 
 |  
Do0mJump3R   
Hält's aus hier
 
Beiträge: 10 
 
 
 
 | 
Verfasst: Do 07.10.10 11:34 
 
Vielen vielen Dank bummi,
 
 die erste Quicksort-Prozedur hat das erwünschte Ergebnis geliefert!!!
 
 Danke euch für eure schnellen Antworten!
 
 Greez
 Do0mJump3R 
 
 | 
 
 |  
 
 
 |