插入排序 - TStringList Delphi
Insertion Sort - TStringList Delphi
我正在尝试使用插入和选择排序对文本文件中的整数 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;
图像中的数据排序完全正确,因为您排序的是字符串值,并且根据您进行的比较,排序是完美的。 "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.
我在控制台中从上面的代码得到的输出 window:
1116
1122
11170
11178
11206
11221
11228
我正在尝试使用插入和选择排序对文本文件中的整数 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;
图像中的数据排序完全正确,因为您排序的是字符串值,并且根据您进行的比较,排序是完美的。 "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.
我在控制台中从上面的代码得到的输出 window:
1116
1122
11170
11178
11206
11221
11228