#arrays #quicksort #freepascal
Вопрос:
Я использую Free Pascal для создания функции сортировки массива целых чисел под названием QuickSort, которая использует алгоритм быстрой сортировки. Вот моя программа:
uses crt;
var
i,n : integer;
A : array[1..100] of integer;
procedure QuickSort(var arr : array of integer; l,r : integer);
var
i,j,y,x : integer;
begin
i := l; j := r;
x := arr[(l r) div 2];
repeat
while arr[i] < x do inc(i);
while x < arr[j] do dec(j);
if i <= j then
begin
y := arr[i]; arr[i] := arr[j]; arr[j] := y;
inc(i); dec(j);
end;
until i > j;
if l < j then QuickSort(arr,l,j);
if i < r then QuickSort(arr,i,r);
end;
BEGIN
readln(n);
for i := 1 to n do
begin
write('A[',i,'] = ');
readln(A[i]);
end;
QuickSort(A,1,n);
for i := 1 to n do write(A[i]:7);
readln;
END.
Каким бы ни был мой вклад, он не работает. Но когда я изменю это
var
i,n : integer;
A : array[1..100] of integer;
procedure QuickSort(var arr : array of integer; l,r : integer);
в это
type
Array_ = array[1..100] of integer;
var
i,n : integer;
A : Array_;
procedure QuickSort(var arr : Array_; l,r : integer);
это работает идеально. Кто-нибудь может мне это объяснить? Спасибо вам :))
Комментарии:
1. Интересно, каких «дополнительных деталей» не хватает близкому избирателю?
Ответ №1:
Когда вы объявляете функцию как
procedure QuickSort(var arr : array of integer; l,r : integer);
вы объявляете массив как «параметр открытого массива», и применяются некоторые специальные правила. «Параметр открытого массива» позволяет передавать функции массивы разного размера. Однако для того, чтобы это работало правильно, необходимо соблюдать некоторые правила, из которых вы не следовали этому:
В теле подпрограммы индексирование начинается с 0 (независимо от того, как был определен переданный массив). Вы можете использовать
Low
иHigh
для изучения диапазона индексов, который также может быть выражен как 0..Длина-1.