CnPack Forum


 
Subject: MicroTip#7 按行排序 TMemo, TRichEdit, TListBox... 中的内容
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-6-6 11:29  Profile | Blog | P.M.  | QQ
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>>




一壶清茶煮青春.
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-6-6 12:05  Profile | Blog | P.M. 
冒泡法?
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-6-6 12:32  Profile | Blog | P.M.  | QQ
恩.
没有任何优化的冒泡法.




一壶清茶煮青春.
Top
 




All times are GMT++8, the time now is 2024-11-22 07:01

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.008517 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP