Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Sortieren Mehrdimensionales Array
tr3bor - Sa 16.12.06 19:03
Titel: Sortieren Mehrdimensionales Array
Hallo,
ich möchte ein Mehrdimensionales Array Sortieren.
Ich habe ein 2 Dimensionales Array, in mehrere Datensätze sind(Zeilen) nun möchte ich die Datensätze so vertauschen das einw bestimmte Spalte Auf oder Absteigend sortiert ist. Nun meine frage wie mache ich das?
Narses - Sa 16.12.06 20:56
Moin!
Du tauscht einfach alle Elemente einer Zeile in deinem Dreieckstausch, fertig. Genaueres, wenn du etwas Code zeigst, wie du das bisher machst. ;)
cu
Narses
Horst_H - Sa 16.12.06 22:19
Hallo,
aus einem TurboPascal Programm umgestrickt.
Delphi-Quelltext
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: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133:
| unit dim2Sort;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
type tZeileIdx = 1..7; tSpalteIdx = 1..7; tData = double; tSpalte = array [tSpalteIdx] of tData;
tmy2dimarray = array [tZeileIdx] of tSpalte;
var Form1: TForm1;
implementation
{$R *.dfm} var
my2dimFeld : tmy2dimarray;
PROCEDURE SortiereNachSpalte(var Feld :tmy2dimarray; Spalte : tSpalteIdx); var VgData : tData; TauschData : tSpalte;
procedure QSort(Links, Rechts : tZeileIdx); var i, j: tZeileIdx; begin i := Links; j := Rechts; VgData := Feld[(Links+Rechts) shr 1][Spalte]; repeat while VgData>Feld[i][Spalte] do Inc(i); while VgData<Feld[j,Spalte] do Dec(j); if i <= j then begin if i <> j then begin TauschData := Feld[i]; Feld[i] := Feld[j]; Feld[j]:= TauschData; end; Inc(i); Dec(j); end; until i > j; if (j-Links)< (Rechts-i) then begin if Links < j then QSort(Links,j); if Rechts > i then QSort(i,Rechts); end else begin if Rechts > i then QSort(i,Rechts); if Links < j then QSort(Links,j); end; end; BEGIN QSOrt(low(tZeileIdx),High(tZeileIdx)); END;
procedure AusgabeFeld(var Feld:tmy2dimarray); var i : tZeileIdx; j : tSpalteIdx; s : string; begin s := ''; Form1.Memo1.Lines.Add(s); For i := low(i) to High(i) do begin s := s+Format('%7d ',[i]); For j := low(j) to High(j) do s := s+Format('%10.7f ',[Feld[i,j]]); Form1.Memo1.Lines.Add(s); s :=''; end; Form1.Memo1.Lines.Add(s); end;
procedure TForm1.Button1Click(Sender: TObject); var i : tZeileIdx; j : tSpalteIdx;
begin memo1.Clear; randomize; for i := Low(tZeileIdx) to High(tZeileIdx) do for j := Low(tSpalte) to High(tSpalte) do my2DimFeld[i,j] := random; Memo1.Lines.Add('Unsortiert');
AusgabeFeld(my2DimFeld);
for j := Low(tSpalte) to High(tSpalte) do begin Memo1.Lines.Add('Sortiert nach Spalte '+Inttostr(j)); SortiereNachSpalte(my2DimFeld,j); AusgabeFeld(my2DimFeld); end; end;
end. |
Gruss Horst
tr3bor - Mo 18.12.06 18:43
Titel: Lösung
HI,
Danke für eure Antworten ich steige da aber nicht durch :(
ich habe das Problem jetzt einfach so Gelöst, dass ich jeweils ein Array pro Spalte habe und die kann man dann ja ganz leicht sortieren.
F34r0fTh3D4rk - Mo 18.12.06 20:10
du sortierst erst alle reihen und dann einmal die erste spalte, fertig.
mfg
Horst_H - Mo 18.12.06 20:29
Hallo,
ich habe es so verstanden das die Zeile erhalten bleiben soll.
sei array:
012
120
201
dann ergibt Sortierung nach Spalte 3
120 (ex Zeile 2)
201 (ex Zeile 3)
012 (ex Zeile 1)
Du verlierst diese Ordnung.
Gruss Horst
jaenicke - Mo 18.12.06 20:33
Titel: Re: Lösung
tr3bor hat folgendes geschrieben: |
HI,
Danke für eure Antworten ich steige da aber nicht durch :(
ich habe das Problem jetzt einfach so Gelöst, dass ich jeweils ein Array pro Spalte habe und die kann man dann ja ganz leicht sortieren. |
Naja, Hauptsache es funktioniert... Aber wenn du gezeigt hättest, wie dein Quelltext aussieht und wie du die Sortierung versucht hast, dann hätten wir dir auch helfen können, es so zu machen, wie du es eigentlich wolltest.
Und naja, wenn du wo was nicht verstehst, kannst du ruhig fragen. ;-)
Wenn du zeigst, was du versucht hast und konkret sagst, wo dein Problem ist, also wo du nicht weiterkommst, dann findest du hier im Forum genug Helfer, die dir das erklären (merkst du ja auch ;-)). Und dann kommst du das Schritt für Schritt zum Ziel. Nur: wenn du keinen Quelltext zeigst und zu gezeigtem Quelltext nur sagst, dass du da nicht durchsteigst, nun ja, wie sollen wir dir da helfen...
Das wollte ich dann doch mal dazu sagen, auch im Hinblick auf weitere Fragen von dir...
tr3bor - Mo 18.12.06 23:11
ja also ich an relevantem Quelltext hatte wohl nur das Mehrdimensionale Array. und ich wollte die zeilen halt gleich behalten. Ich habe das nun so gelöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| laenge := length(jobs_time); for ie := laenge DownTo 1 Do Begin for oe := 0 To laenge-1 Do Begin if StrToInt(jobs_time[oe]) > StrToInt(jobs_time[oe+1]) then Begin tausche(jobs_time[oe],jobs_time[oe+1]); tausche(jobs_con[oe],jobs_con[oe+1]); tausche(jobs_emp[oe],jobs_emp[oe+1]); tausche(jobs_id[oe],jobs_id[oe+1]); end; end; end; |
Habe den alt bekannten BubbleSort benutzt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!