给你一个排序过程,你可以参考。很容易。
procedure QuickSort(var A:array of Integer
iLo,iHi:Integer);
var
Lo,Hi,Mid,T:Integer;
begin
Lo:=iLo;
Hi:=iHi;
Mid:=A[(Lo+Hi)div 2];
repeat
while A[Lo]<Mid do
Inc(Lo);
while A[Hi]>Mid do
Dec(Hi);
if Lo<=Hi then
begin
T:=A[Lo];
A[Lo]:=A[Hi];
A[Hi]:=T;
Inc(Lo);
Dec(Hi);
end;
until Lo>Hi;
if Hi>iLo then QuickSort(A,iLo,Hi);
if Lo<iHi then QuickSort(A,Lo,iHi);
end;
那你就修改一下上面的过程。排序A的同时,对B进行修改,让A和B保持对应关系。
procedure QuickSort(var A:array of Integer;var B:array of Integer
iLo,iHi:Integer);
var
Lo,Hi,Mid,T:Integer;
begin
Lo:=iLo;
Hi:=iHi;
Mid:=A[(Lo+Hi)div 2];
repeat
while A[Lo]<Mid do
Inc(Lo);
while A[Hi]>Mid do
Dec(Hi);
if Lo<=Hi then
begin
T:=A[Lo];
A[Lo]:=A[Hi];
A[Hi]:=T;
T:=B[Lo];
B[Lo]:=B[Hi];
B[Hi]:=T;
Inc(Lo);
Dec(Hi);
end;
until Lo>Hi;
if Hi>iLo then QuickSort(A,iLo,Hi);
if Lo<iHi then QuickSort(A,Lo,iHi);
end;
万能的排序方法:
type
urecord=record
a:UAType;
b:uBtype;
end;
function UCompare(Item1, Item2: Pointer): Integer;
begin
if urecord(Item1^).a>urecord(Item2^).a then result:=1
else if urecord(Item1^).a=urecord(Item2^).a then result:=0
else if urecord(Item1^).a<urecord(Item2^).a then result:=-1;
//这里的大于等于小于只是象征意义,表示你想让什么样的数据在前
end;
//----------排序---
var
list:Tlist;
r:array[1..6] of urecord;
i:integer;
begin
list:= TList.Create;
try
r[1].a:=a1;
r[1].b:=b1;
r[2].a:=a1;
r[2].b:=b1;
....
//这里根据你的需要构造记录
for i:=1 to 6 do
list.add(@R);
list.sort(UCompare);//按a排好了
...
//可以访问了。比如:
for i:=0 to list.count-1 do Ubtype:=urecord(list.Items^).b;
finally
list.Free;
end;
end;
看到了吗?这样可以对任何类型的数据排序。