帮忙看一下这个repeat循环的结束条件为什么这样写。

来源:百度知道 编辑:UC知道 时间:2024/06/08 16:44:40
var a,c:array [0..30] of integer;
i:integer;
procedure merge(L,M,H:integer);
var p1,p2,p3,j:integer;
begin
p1:=L; p2:=M+1; p3:=L;
while (p1<=M) and (p2<=H) do
begin
if a[p1]<=a[p2] then begin
c[p3]:=a[p1]; p1:=p1+1;
end
else begin
c[p3]:=a[p2]; p2:=p2+1;
end;
p3:=p3+1;
end;
if p1>M then for j:=p2 to H do begin c[p3]:=a[j]; p3:=p3+1; end;
if p2>H then for j:=p1 to M do begin c[p3]:=a[j]: p3:=p3+1; end;
for j:=L to H do a[j]:=c[j];
end;

procedure mergesort;
var i,s,k:integer;
begin
s:=1;
while s<n do
begin
i:=1;
repeat
merge(s*(i-1)+1,s*i,s*(i+1)){merge是上面的子程序};
i:=i+2;
until i>n;
s:=s*2;

我看这个程序有问题
随便举个例子吧:
当n=30 y也就是对30个数归并排序
这时如果S=2,i=29 按程序意思循环仍会继续
merge(s*(i-1)+1,s*i,s*(i+1))实际上是
merge(57,58,60) 这个调用就已经越界了