gpt4 book ai didi

algorithm - delphi 字符串数组的归并排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:09 25 4
gpt4 key购买 nike

<分区>

http://www.explainth.at/en/delphi/dsort.shtml 上找到了这个编码归并排序(站点关闭但尝试 wayback machine 或此站点:http://read.pudn.com/downloads192/sourcecode/delphi_control/901147/Sorts.pas__.htm)但本质上定义的数组不是用于字符串数组。类型 TSortArray = array[0..8191] of Double;我想传递一个可能会消除重复项的字符串数组(这将是 Union?)并尽可能保留原始顺序,以便稍后将其恢复到原始索引位置减去重复项(原始索引) 因此数组可以传回以进行进一步处理。我正在使用包含数百万个字符串(14 到 3000 万)的非常大的字符串文件,因此 TStringList 不是一个选项。这些大文件的最佳选择是使用字符串数组或记录数组(或者可能是单链表??)并使用为大量数据制作的稳定算法进行排序。

  1. 如何更改它以获取字符串数组?
  2. 如何进一步修改以删除或至少标记重复项?
  3. 是否可以存储原始索引号以将字符串放回到原始位置?
  4. 与单个链表相比,对于大量字符串,字符串数组或记录数组哪个更好?

问题按重要性顺序列出,因此如果您只回答问题 1 就可以了。预先感谢您的所有输入。


procedure MergeSort(var Vals:TSortArray;ACount:Integer);
var AVals:TSortArray;

procedure Merge(ALo,AMid,AHi:Integer);
var i,j,k,m:Integer;
begin
i:=0;
for j:=ALo to AMid do
begin
AVals[i]:=Vals[j];
inc(i);
//copy lower half or Vals into temporary array AVals
end;

i:=0;j:=AMid + 1;k:=ALo;//j could be undefined after the for loop!
while ((k < j) and (j <= AHi)) do
if (AVals[i] < Vals[j]) then
begin
Vals[k]:=AVals[i];
inc(i);inc(k);
end else
begin
Vals[k]:=Vals[j];
inc(k);inc(j);
end;
{locate next greatest value in Vals or AVals and copy it to the
right position.}

for m:=k to j - 1 do
begin
Vals[m]:=AVals[i];
inc(i);
end;
//copy back any remaining, unsorted, elements
end;

procedure PerformMergeSort(ALo,AHi:Integer);
var AMid:Integer;
begin
if (ALo < AHi) then
begin
AMid:=(ALo + AHi) shr 1;
PerformMergeSort(ALo,AMid);
PerformMergeSort(AMid + 1,AHi);
Merge(ALo,AMid,AHi); <==== passing the array as string causes AV breakdown here
end;
end;

begin
SetLength(AVals, ACount);
PerformMergeSort(0,ACount - 1);
end;

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com