MicroTip#7 按行排序 TMemo, TRichEdit, TListBox... 中的内容
MicroTip#7 按行排序 TMemo, TRichEdit, TListBox... 中的内容
Wrtten by SkyJacker 2007.06.06
QQ Discuss Group: 130970
http://www.cnpack.org
1.函数功能:按行排序 TMemo, TRichEdit, TListBox... 中的内容
适用范围:含有 TStrings 属性的类
2.使用实例:
SortStr(mmo1.Lines); // 排序 TMemo 的内容
SortStr(lst1.Items); // 排序 TListBox 的内容
3.函数实现:
// 字符串列表排序
procedure SortStr(AStrList: TStrings);
var
LineNo: Integer;
S1, S2: string;
Swapped : Boolean;
begin
repeat
Swapped := False;
for LineNo := 0 to AStrList.Count-2 do
begin
S1 := AStrList.Strings[LineNo];
S2 := AStrList.Strings[LineNo+1];
if S2 < S1 then
begin
Swapped := True;
AStrList.Exchange(LineNo, LineNo+1);
end;
end;
until(not Swapped);
end;
// 数字列表排序:整数、浮点数
procedure SortNumber(AStrList: TStrings);
var
LineNo: Integer;
S1, S2: string;
N1, N2: Double;
Swapped : Boolean;
begin
repeat
Swapped := False;
for LineNo := 0 to AStrList.Count-2 do
begin
S1 := AStrList.Strings[LineNo];
S2 := AStrList.Strings[LineNo+1];
N1 := StrToFloatDef(S1, 0);
N2 := StrToFloatDef(S2, 0);
if N2 < N1 then
begin
Swapped := True;
AStrList.Exchange(LineNo, LineNo+1);
end;
end;
until(not Swapped);
end;
4.调试记录:
// 只要小循环有一个交换, 则置循环标志位 Flag
0: 16 1 8 5 9 4 Flag=0
1: 1 16 8 5 9 4 Flag=1
2: 1 8 16 5 9 4
3: 1 8 5 16 9 4
4: 1 8 5 9 16 4
5: 1 8 5 9 4 16 // 第 1 次循环遍历结束
如果 Flag = 1 , 继续下一次遍历:
如果 Flag =0 , 排序成功.
每次遍历都是依次两两比较, 因此, 一次遍历需要比较 (n-1) 次,
最坏的情况是需要遍历 n 次.
最大时间复杂度为: n*(n-1)
5.参考资料:<<BASMForBeginners>>
|