| 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>>
 |