【发布时间】:2018-01-18 23:16:58
【问题描述】:
我尝试为字符串实现合并排序,但是我无法执行递归部分,并且收到错误“无效指针操作”
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var i : Integer;
const MyArray : array[1..5]of string = ('hi', 'zebra', 'apple', 'Xylophone', 'dog');
Procedure merge(result, left, right : array of string);
var i, i1, i2 : Integer;
begin
i1 := 0;
i2 := 0;
for i := 0 to Length(result) do
begin
if (i2 >= Length(right)) or (i1 < Length(left)) and (StrComp(PChar(left[i]), PChar(right[i2])) < 0) then
begin
result[i] := left[i1];
inc(i1);
end
else
begin
result[i] := right[i2];
inc(i2);
end;
end;
end;
Procedure mergeSort(OriginalList : array of string);
var left, right : array of string;
i : Integer;
begin
if (Length(OriginalList) >= 2) then
begin
setlength(left, length(OriginalList) div 2);
setlength(right, length(OriginalList) - (length(OriginalList) div 2));
for i := 0 to Length(left) do
begin
left[i] := OriginalList[i];
end;
for i := 0 to Length(right) do
begin
right[i] := OriginalList[i + Length(OriginalList) div 2];
end;
mergeSort(left);
mergeSort(right);
merge(OriginalList, left, right);
end;
end;
begin
writeln('The data before sorting: ');
for i := low(MyArray) to High(MyArray) do
begin
write(MyArray[i]+' ');
end;
writeln;
mergeSort(MyArray);
writeln('The data before sorting: ');
for i := low(MyArray) to High(MyArray) do
begin
write(MyArray[i]+' ');
end;
readln;
end.
在 mereSort 函数的行中,我记得数组“left”和“right”上的合并排序函数,我收到错误消息,但我不太明白为什么?
【问题讨论】:
-
在调试器中单步执行代码时会看到什么?
-
@KenWhite 我完全忘了逐步完成我的程序......我很抱歉。我已经意识到我不认为它首先正确地设置了左右数组,因为我可以看到变量包含的内容。 youtu.be/tUC1rGFJIzk
-
请记住,合并排序对于小集合是非常低效的,这就是为什么大多数有效的合并排序实现在元素数量较少时使用插入排序。因此,您开始递归地使用归并排序,但是当您的左/右数组变小时,您切换到插入排序来完成该过程。根据我的经验,这个“神奇”数字介于 8 到 32 个元素之间,但可能会有所不同。
-
您忘记调试程序了?来吧。
-
@DavidHeffernan Yeh 我知道是对的.. :( 我是自学的,对此很陌生:D
标签: delphi recursion mergesort delphi-xe