aboutsummaryrefslogtreecommitdiffstats
path: root/Game/Code/Classes/UMergeSort.pas
diff options
context:
space:
mode:
authorbrunzelchen <brunzelchen@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-10-05 18:28:42 +0000
committerbrunzelchen <brunzelchen@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-10-05 18:28:42 +0000
commit65ddad359ed3b9b739215ec89a7645455ae10dce (patch)
tree7fdc703f290b37e68ce0e6a2c56d5bdd2f7ee07b /Game/Code/Classes/UMergeSort.pas
parentdbe444f87b85da27a37f38e80bfd540178b8dde0 (diff)
downloadusdx-65ddad359ed3b9b739215ec89a7645455ae10dce.tar.gz
usdx-65ddad359ed3b9b739215ec89a7645455ae10dce.tar.xz
usdx-65ddad359ed3b9b739215ec89a7645455ae10dce.zip
- added webcam support
- faster program start - faster sorting (mergesort) - sync lyrics to music - some new backgrounds and credits graphics (thx to MezzoX) - own thread for video decoding - finished 6-Player-on-one-screen-mode - changqed player-colors - fixed some bugs... git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/1.0.1 Challenge MOD@2637 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to '')
-rw-r--r--Game/Code/Classes/UMergeSort.pas101
1 files changed, 101 insertions, 0 deletions
diff --git a/Game/Code/Classes/UMergeSort.pas b/Game/Code/Classes/UMergeSort.pas
new file mode 100644
index 00000000..8a0aa124
--- /dev/null
+++ b/Game/Code/Classes/UMergeSort.pas
@@ -0,0 +1,101 @@
+unit UMergeSort;
+
+interface
+
+type
+ TDirection = (dSourceSource, dSourceTemp, dTempTemp, dTempSource);
+
+ TCompareProc = function(TempIndex, SourceIndex: integer): boolean; cdecl;
+ PCompareProc = ^TCompareProc;
+
+ TCopyProc = function(iSourceIndex, iDestIndex: integer; bDirection: TDirection): boolean; cdecl;
+ PCopyProc = ^TCopyProc;
+
+ TMergeSorter = class
+ private
+ n: integer;
+
+ aCallbackCompare: TCompareProc;
+ aCallbackCopy: TCopyProc;
+
+ procedure MergeSort(lo, hi: integer);
+ procedure Merge(lo, m, hi: integer);
+ public
+ procedure Sort(n: integer; aCompare: TCompareProc; aCopy: TCopyProc);
+ end;
+
+
+implementation
+
+procedure TMergeSorter.Sort(n: integer; aCompare: TCompareProc; aCopy: TCopyProc);
+begin
+ Self.n := n;
+ Self.aCallbackCompare := aCompare;
+ Self.aCallbackCopy := aCopy;
+ MergeSort(0, n-1);
+end;
+
+procedure TMergeSorter.MergeSort(lo, hi: integer);
+var
+ m: integer;
+
+begin
+ if (lo<hi) then
+ begin
+ m := (lo+hi) div 2;
+ MergeSort(lo, m);
+ MergeSort(m+1, hi);
+ Merge(lo, m, hi);
+ end;
+end;
+
+procedure TMergeSorter.Merge(lo, m, hi: integer);
+var
+ i, j, k: integer;
+
+begin
+ i := 0;
+ j := lo;
+
+ // vordere Hälfte von a in Hilfsarray b kopieren
+ while (j<=m) do
+ begin
+ aCallbackCopy(j, i, dSourceTemp);
+ //b[i] := a[j];
+ inc(i);
+ inc(j);
+ end;
+
+ i := 0;
+ k := lo;
+ // jeweils das nächstgrößte Element zurückkopieren
+ while ((k<j) and (j<=hi)) do
+ begin
+ if aCallbackCompare(i, j) then
+ //if (b[i]<=a[j]) then
+ begin
+ aCallbackCopy(i, k, dTempSource);
+ //a[k] := b[i];
+ inc(k);
+ inc(i);
+ end else
+ begin
+ aCallbackCopy(j, k, dSourceSource);
+ //a[k] := a[j];
+ inc(k);
+ inc(j);
+ end;
+ end;
+
+ // Rest von b falls vorhanden zurückkopieren
+ while (k<j) do
+ begin
+ aCallbackCopy(i, k, dTempSource);
+ //a[k] := b[i];
+ inc(k);
+ inc(i);
+ end;
+
+end;
+
+end.