【问题标题】:Insertion Sort - TStringList Delphi插入排序 - TStringList Delphi
【发布时间】:2021-05-15 08:13:59
【问题描述】:

我正在尝试使用插入和选择排序对文本文件中的整数 TStringList 进行排序。选择排序工作正常,但插入排序不适用于我的代码。有人能告诉我哪里错了吗?我的“numbers.txt”有 5000 行数字。提前致谢

更新:我已经稍微编辑了我的代码,它现在可以与插入排序一起使用,但它只对图像上的 4 个整数索引进行排序

var
  i, Position, n: integer;
  Value: string;
begin
  n := Items.Count;
  for i := 1 to n - 1 do
  begin
    Value := Items[i];
    Position := i-1;
     while (Position >0) and (Items[Position]>Value) do
      begin
        Items[Position+1]:= Items[Position]  ;
        Position := Position -1 ;
        end;
        Items[Position+1] := Value;
  end;
end;

【问题讨论】:

  • 欢迎来到 StackOverflow!您的代码甚至无法编译:缺少“then”。它既不能作为插入排序。这种排序是在动态构建列表时完成的,从一个空列表开始,扫描一个项目的正确位置并将其插入那里或将其添加到列表的末尾。另外,为什么不将所有文本转换为整数?排序可能会更快,但排序顺序不一样,除非所有整数都具有相同的长度并且全部用零填充。
  • 这个表达式错误:if Position Done := true
  • 使用调试器自己解决。从简单的输入数据开始,逐步建立起来。
  • 非常感谢!!
  • 请务必使用不同顺序的测试集进行测试。如果第一个值是最大的值,您会感到惊讶。使用一个小集合,比如“5”、“2”、“1”,然后按 F8 单步执行代码,按照代码正在执行的操作。

标签: sorting delphi insertion tstringlist


【解决方案1】:

您在图像中的数据完全按照应有的方式排序,因为您正在对字符串值进行排序,并且基于比较您所做的排序是完美的。 "1143" 正好位于字符串值 "11413""11443" 之间,因为比较是逐个字符进行的,直到值中最短的长度。 "1141" < "1143" < "1144",基于每个字符串的前四个字符。

如果你想要一个实际的整数排序,那么你需要在比较它们之前将两个值转换为整数。像这样的东西应该可以工作(注意我没有测试你的整体排序逻辑 - 我只是使用了展示这个概念的值):

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Classes;

var
  i, Position, n: integer;
  Value: integer;
  Items: TStringList;
begin
  Items := TStringList.Create;
  try
    Items.DelimitedText := '1116,11170,11178,11206,1122,11221,11228';
    n := Items.Count;
    for i := 1 to n - 1 do
    begin
      Value := StrToInt(Items[i]);
      Position := i - 1;
       while (Position > 0) and (StrToInt(Items[Position]) > Value) do
        begin
          Items[Position + 1]:= Items[Position];
          Position := Position - 1 ;
        end;
        Items[Position+1] := IntToStr(Value);
    end;
    for i := 0 to Items.Count - 1 do
      WriteLn(Items[i]);
  finally
    Items.Free;
  end;
  ReadLn;
end.

我在控制台窗口中从上面的代码得到的输出:

1116
1122
11170
11178
11206
11221
11228

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多