hoty
31.07.2008, 22:23
Это сортировка Методом Хоара :
На входе :
a: массив чисел - integer;
l,r - границы сортируемой части массива (l=1;r=n);
c,m - количество сравнений, пересылок элементов.
procedure sort (var a: array of integer; l,r: integer; var c,m: integer);
var i,j, x,t: integer;
begin
x:=a[L]; {novii element X}
i:=L; j:=R; {prisvaivautsya L,R rabochie chasti massiva }
while i<=j do
begin
while a[i]<x do begin i:=i+1; {C}c:=c+1; end;
while a[j]>x do begin j:=j-1; {C}c:=c+1; end;
{C}c:=c+2;
if i<=j then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t; {M}m:=m+3;
i:=i+1; j:=j-1;
end;
end;
if L<j then sort(a,L,j,c,m); {sortirovka chasti L,J}
if i<R then sort(a,i,R,c,m); {sortirovka chasti i,R}
end;
Вопрос : почему если n (кол-во элементов массива)
< 200 то результат c нормально отображается.
> 200 (300 и более, то при подсчете числа c результат уходит в -, т.е, например, -5123 ?
Как исправить это ? Необходимо, чтобы считалось c правильно при 400 и более.
p.s: аналогичное происходит с возведение x в степень 2 :
если написать x*xто если пишем больше 100 считает в минус.
если же написать так x=exp(2*ln(x)), то считает, практически любые числа правильно.
На входе :
a: массив чисел - integer;
l,r - границы сортируемой части массива (l=1;r=n);
c,m - количество сравнений, пересылок элементов.
procedure sort (var a: array of integer; l,r: integer; var c,m: integer);
var i,j, x,t: integer;
begin
x:=a[L]; {novii element X}
i:=L; j:=R; {prisvaivautsya L,R rabochie chasti massiva }
while i<=j do
begin
while a[i]<x do begin i:=i+1; {C}c:=c+1; end;
while a[j]>x do begin j:=j-1; {C}c:=c+1; end;
{C}c:=c+2;
if i<=j then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t; {M}m:=m+3;
i:=i+1; j:=j-1;
end;
end;
if L<j then sort(a,L,j,c,m); {sortirovka chasti L,J}
if i<R then sort(a,i,R,c,m); {sortirovka chasti i,R}
end;
Вопрос : почему если n (кол-во элементов массива)
< 200 то результат c нормально отображается.
> 200 (300 и более, то при подсчете числа c результат уходит в -, т.е, например, -5123 ?
Как исправить это ? Необходимо, чтобы считалось c правильно при 400 и более.
p.s: аналогичное происходит с возведение x в степень 2 :
если написать x*xто если пишем больше 100 считает в минус.
если же написать так x=exp(2*ln(x)), то считает, практически любые числа правильно.