Danke werde das mal nachverfolgen.
Ist das ein Ansatz der Sortierfunktion?
Die habe ich in Delphi so umgelegt.. (Ohne gewähr das es korrekt ist.)
C++
Code:
void SortShortTagArray (OUT vector<short> &A1, OUT vector<short> &A2, IN long nCount) {
long nStack[1000] = {0};
long nBeg = 0;
long nEnd = nCount - 1;
long nB, nE, nS, nPiv;
nB = nE = nS = nPiv = 0;
do {
do {
nPiv = (long) ((nEnd + nBeg) / 2);
nB = nBeg;
nE = nEnd;
do {
while (A1[nB] < A1[nPiv]) {
++nB;
}
while (A1[nE] > A1[nPiv]) {
--nE;
}
if (nB > nE) { break; }
if (nB < nE) {
swap(A1[nB],A1[nE]);
swap(A2[nB],A2[nE]);
}
++nB;
--nE; }
while (nB <= nE);
if (nB < nEnd) {
nStack[nS] = nB;
nStack[nS + 1] = nEnd;
nS += 2;
}
nEnd = nE;}
while (nBeg < nEnd);
if (nS == 0) { break; }
nS -= 2;
nBeg = nStack[nS];
nEnd = nStack[nS + 1]; }
while(-1);
}
Delphi..
Delphi-Quellcode:
procedure TSkinSpriteContainer.SortShortTagArray(
var A1, A2: TArray<TgObj>; Count: Integer);
var
nStack:
array [0..1000]
of Integer;
nBeg, nEnd: Integer;
nB, nE, nS, nPiv: Integer;
begin
nBeg := 0; nS := 0; nB := 0; nE := 0; nPiv := 0;
nEnd := Count - 1;
FillChar(nStack, sizeof(nStack), 0);
while(true)
do
begin
while (nBeg < nEnd)
do
begin
nPiv := (nEnd + nBeg)
div 2;
nB := nBeg;
nE := nEnd;
while (nB <= nE)
do
begin
// while (A1[nB] < A1[nPiv]) do << will nicht
// inc(nB);
//
// while (A1[nE] > A1[nPiv]) do << will nicht
// dec(nE);
if (nB > nE)
then
break;
if (nB < nE)
then
begin
SwapTgObj(A1[nB], A1[nE]);
SwapTgObj(A2[nB], A2[nE]);
end;
inc(nB);
dec(nE);
end;
if (nB < nEnd)
then
begin
nStack[nS] := nB;
nStack[nS + 1] := nEnd;
nS := nS + 2;
end;
nEnd := nE;
end;
if (nS = 0)
then
break;
nS := nS - 2;
nBeg := nStack[nS];
nEnd := nStack[nS + 1];
end;
end;
procedure TSkinSpriteContainer.SwapTgObj(
var Value1, Value2: TgObj);
var
lTemp: TgObj;
begin
lTemp := Value1;
Value1 := Value2;
Value2 := lTemp;
end;
Muss ihn mal fragen was genau er hier sortiert.
Mit den A,B,C variablen komm ich nicht zurecht sind nicht Aussage kräftig in seinem Code Schnipsel.
gruss