AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Mergesort für zweidimensionales Array
Thema durchsuchen
Ansicht
Themen-Optionen

Mergesort für zweidimensionales Array

Offene Frage von "tryanderror"
Ein Thema von tryanderror · begonnen am 4. Sep 2009 · letzter Beitrag vom 9. Sep 2009
Antwort Antwort
tryanderror

Registriert seit: 23. Aug 2008
10 Beiträge
 
#1

Mergesort für zweidimensionales Array

  Alt 4. Sep 2009, 23:45
Hallo zusammen,

Ich möchte ein zweidimensionales Array mit Mergesort sortieren, sodass hinterher die einzelnen "Zuordnungen" im Array erhalten bleiben:

Code:
Unsortiert:       Sortiert:        Was ich vermeiden möchte (sortiert):
3, 33              1, 11             1, 33
5, 55              3, 33             3, 55
1, 11       ==>   4, 44             4, 11
4, 44              5, 55             5, 44
7, 77              7, 77             7, 77
Für ein eindimensionales Array klappt das soweit, dazu nehme ich den Delphi-Code von http://www.stefan-baur.de/cs.algo.mergesort.html
Aber lässt er sich (bzw. Mergesort allgemein) auf zweidimensionale Arrays erweitern?

Vielen Dank im Voraus!
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Mergesort für zweidimensionales Array

  Alt 4. Sep 2009, 23:52
So wie ich das sehe, willst du ein Array von Arrays nach dem ersten Element der Elemente aufsteigend sortieren. Das sollte eigentlich prima gehen, wenn du immer nur das erste Element zum Vergleich anfasst, aber das ganze Array für Vertauschungen/Verschiebungen/Merges benutzt.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Mergesort für zweidimensionales Array

  Alt 4. Sep 2009, 23:56
Beim Sortieren gibt es zwei grundsätzliche Operationen:
1.) Vergleichen zweier Elemente
2.) Vertauschen zweier Elemente

In deinem speziellen Fall musst du lediglich dafür sorgen, das beim Vertauchen beide Werte vertauscht werden.
Als Vorübung dazu schreibe dir eine Prozedure, die diese Vertauschung vornimmt.
Delphi-Quellcode:
// Code ungeprüft, da IDE z.Zt. defekt - aber das Prinzip sollte klarwerden
type
  TZeile = array[0..1] of integer;
  TSortArray = array[0..49] of TZeile; //= array[0..49][0..1] of integer;

procedure SwapArrayZeile(var a, b : TZeile);
var
  c : TZeile;
begin
  c := a;
  a := b;
  b := c;
end;
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

Re: Mergesort für zweidimensionales Array

  Alt 4. Sep 2009, 23:57
solange die zusammengehörigen Werte in untergeordneten Arrays liegen, ist das kein Problem

statt array of Integer dem in dem Beispielcode da drüben
einfach deine Array-Definition angeben

und dann einfach das untergeordnete Array wie eine normale Variable behandeln.

Zitat:
a = array of array[0..1] of integer
bei a[x] := a[y]; würde das gesamte Unterarray sozusagen kopiert
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
tryanderror

Registriert seit: 23. Aug 2008
10 Beiträge
 
#5

Re: Mergesort für zweidimensionales Array

  Alt 5. Sep 2009, 19:00
Erstmal vielen Dank für eure Antworten

Mit Sortierverfahren kenne ich mich leider nicht wirklich aus, sodass ich eure Antworten nicht ganz verstanden habe.
Das Array, das ich sortieren möchte, heißt erstmal "test":
Code:
var test: array[0..3, 0..1] of Integer;
Ist das also ein "array of array of Integer"?

Ich habe es mal mit "array of array of Integer" versucht, sodass die Deklaration der Prozedur nun so aussieht:
Code:
procedure MergeSort(var A: array of array[0..1] of Integer);
Allerdings bekomme ich beim Kompilieren in der Zeile der Deklaration den Fehler "[Error] mMergeSort.pas(5): 'OF' expected but '(' found"

Scheinbar mag Delphi es nicht, wenn ich direkt "array of array[0..1] of Integer) schreibe - wie kann ich das "umgehen"?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

Re: Mergesort für zweidimensionales Array

  Alt 5. Sep 2009, 19:02
das geht schon alleine wegen der starken Typprüfung von Delphi nicht, selbst wenn man die Prozedure so definiert bekommt

Delphi-Quellcode:
type Ttest: array[0..3, 0..1] of Integer;

var test: Ttest;

procedure MergeSort(var A: Ttest);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
tryanderror

Registriert seit: 23. Aug 2008
10 Beiträge
 
#7

Re: Mergesort für zweidimensionales Array

  Alt 5. Sep 2009, 23:33
Ah danke, damit bin ich schonmal einen Schritt weiter gekommen.

Jetzt bekomme ich in der Zeile
Code:
SetLength(SA, (HiL - LoL + 1) + (HiR - LoR + 1));
den Fehler "[Error] mMergesort.pas(24): Incompatible types" und der Cursor steht hinter dem "SA,".
Mir ist klar, dass - da SA jetzt ein zweidimensionales Array ist - es so nicht stehenbleiben kann. Scheinbar wird in der Zeile die Anzahl der Elemente im Array "SA" neu gesetzt (oder so ähnlich) - ich habe es mal mit
Code:
SetLength(High(SA), (HiL - LoL + 1) + (HiR - LoR + 1));
versucht, aber es schien nicht ganz richtig zu sein...
Ich hoffe ihr könnt mir weiterhelfen

Ansonsten überlege ich, ob ich den Code nicht lieber selbst neu schreiben sollte. Dafür spricht sicherlich der Lerneffekt, bei Wikipedia gibt es im Abschnitt Implementierung (http://de.wikipedia.org/wiki/Mergesort#Implementierung) ja den Pseudo-Code. Ist da mit "antworte liste" "result:=liste" gemeint?
Gegen das selbst programmieren spricht momentan, dass der Code sehr effizient arbeiten muss, da ich hinterher sehr viele Daten in einem Array möglichst schnell sortieren möchte. Ich gehe mal davon aus, dass der MergeSort-Code für Delphi von der Seite, die ich oben gepostet habe, recht effizient arbeitet - und ich fürchte, dass ich als Anfänger nicht an diese Effizienz herankommen werde...
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

Re: Mergesort für zweidimensionales Array

  Alt 7. Sep 2009, 08:37
Bitte zeig uns doch mal deine Deklaration von SA.
Besser noch du hängst die komplette Unit an deinen Beitrag.
  Mit Zitat antworten Zitat
tryanderror

Registriert seit: 23. Aug 2008
10 Beiträge
 
#9

Re: Mergesort für zweidimensionales Array

  Alt 7. Sep 2009, 22:38
Okay, im Anhang befindet sich die mMergeSort.pas, an der ich bereits herumgebastelt habe, damit das MergeSort auch für zweidimensionale Arrays funktioniert.
Angehängte Dateien
Dateityp: pas mmergesort_887.pas (2,3 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#10

Re: Mergesort für zweidimensionales Array

  Alt 9. Sep 2009, 10:37
Die Sortierfunktion ist auf dynamische Arrays ausgelegt, ein SetLength auf ein Array konstanter Größe ist natürlich nicht möglich.
Ich habe den Elementen, die im Array verwaltet werden, einen eigenen Typ spendiert und wie bereits vorgeschlagen eine Vergleichsfunktion angelegt. Ändert sich der Typ der Elemente, muss eigentlcih nur diese Vergleichsfunktion angepasst werden (und natürlich auch UnitTest).
Angehängte Dateien
Dateityp: pas mmergesort_139.pas (3,1 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz