Board logo

Subject: MicroTip#7 按行排序 TMemo, TRichEdit, TListBox... 中的内容 [Print This Page]

Author: skyjacker    Time: 2007-6-6 11:29     Subject: 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>>
Author: Passion    Time: 2007-6-6 12:05

冒泡法?
Author: skyjacker    Time: 2007-6-6 12:32

恩.
没有任何优化的冒泡法.





Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0