首页
社区
课程
招聘
请教Delphi高手TList.Sort的用法。刚刚学Delphi:)
2005-5-2 17:36 8257

请教Delphi高手TList.Sort的用法。刚刚学Delphi:)

2005-5-2 17:36
8257
type
  person=record
    nAge: Integer;
    strName: String;
  end;

...

lstPerson:TList;
lstPerson := TList.Create();
lstPerson.Add(...)

如何进行lstPerson.Sort()?
谢谢!

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 0
打赏
分享
最新回复 (3)
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
baby2008 28 2005-5-2 18:15
2
0
TList提供Sort,其实现是QuickSort,但是在使用的时候发现一个BUG,就是没有进行边界检查

因此,如果一个List中,所有结果的相同,进行排序的话,那么你的程序将死循环下去,或者发生异常。

其关键代码:

procedure QuickSort(SortList: PPointerList; L, R: Integer;

SCompare: TListSortCompare);

var

I, J: Integer;

P, T: Pointer;

begin

repeat

I := L;

J := R;

P := SortList^[(L + R) shr 1];

repeat

while SCompare(SortList^[I], P) < 0 do { Error }

Inc(I);

while SCompare(SortList^[J], P) > 0 do { Error }

Dec(J);

if I <= J then

begin

T := SortList^[I];

SortList^[I] := SortList^[J];

SortList^[J] := T;

Inc(I);

Dec(J);

end;

until I > J;

if L < J then

QuickSort(SortList, L, J, SCompare);

L := I;

until I >= R;

end;

procedure TList.Sort(Compare: TListSortCompare);

begin

if (FList <> nil) and (Count > 0) then

QuickSort(FList, 0, Count - 1, Compare);

end;

应该修正代码如下:

procedure QuickSort(SortList: PPointerList; L, R: Integer;

SCompare: TListSortCompare);

var

I, J: Integer;

P, T: Pointer;

begin

repeat

I := L;

J := R;

P := SortList^[(L + R) shr 1];

repeat

while (SCompare(SortList^[I], P) < 0) and (I < R) do

Inc(I);

while SCompare(SortList^[J], P) > 0 and (J > L)do

Dec(J);

if I <= J then

begin

T := SortList^[I];

SortList^[I] := SortList^[J];

SortList^[J] := T;

Inc(I);

Dec(J);

end;

until I > J;

if L < J then

QuickSort(SortList, L, J, SCompare);

L := I;

until I >= R;

end;

procedure TList.Sort(Compare: TListSortCompare);

begin

if (FList <> nil) and (Count > 1) then

QuickSort(FList, 0, Count - 1, Compare);

end;

实际上,不是BUG,主要是回调函数返回值由问题。 :(,不过加上边界检查之后,就OK了。
雪    币: 111
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
window 1 2005-5-5 11:40
3
0
这个怎么不到大富翁上去发...
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Nada 2005-5-6 01:12
4
0
这里都是大大虾  哈哈``~`
游客
登录 | 注册 方可回帖
返回