2015-12-28 14:25:15 +03:00
|
|
|
|
//Демонстрация использования параллельных секций на примере быстрой сортировки
|
2015-05-14 22:35:07 +03:00
|
|
|
|
var
|
|
|
|
|
|
a: array of integer;
|
|
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
|
|
b: array of integer;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Partition - разделение A[l]..A[r] на части A[l]..A[q] <= A[q+1]..A[r]
|
2015-05-14 22:35:07 +03:00
|
|
|
|
function Partition(a: array of integer; l, r: integer): integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
var i := l - 1;
|
|
|
|
|
|
var j := r + 1;
|
|
|
|
|
|
var x := A[l];
|
|
|
|
|
|
while True do
|
|
|
|
|
|
begin
|
|
|
|
|
|
repeat
|
|
|
|
|
|
i += 1;
|
|
|
|
|
|
until A[i] >= x;
|
|
|
|
|
|
repeat
|
|
|
|
|
|
j -= 1;
|
|
|
|
|
|
until A[j] <= x;
|
|
|
|
|
|
if i < j then
|
|
|
|
|
|
Swap(A[i], A[j])
|
|
|
|
|
|
else
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := j;
|
|
|
|
|
|
exit;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Параллельная cортировка частей
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure Sort(A: array of integer; l, r: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if l >= r then
|
|
|
|
|
|
exit;
|
|
|
|
|
|
var j := Partition(A, l, r);
|
|
|
|
|
|
{$omp parallel sections}
|
|
|
|
|
|
begin
|
|
|
|
|
|
Sort(A, l, j);
|
|
|
|
|
|
Sort(A, j + 1, r);
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Параллельная сортировка
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure QuickSortParrallel(A: array of integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
Sort(A, 0, a.Length - 1)
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//Последовательная Сортировка частей
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure SortSeq(a: array of integer; l, r: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if l >= r then
|
|
|
|
|
|
exit;
|
|
|
|
|
|
var j := Partition(A, l, r);
|
|
|
|
|
|
SortSeq(A, l, j);
|
|
|
|
|
|
SortSeq(A, j + 1, r);
|
|
|
|
|
|
end;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//Последовательная сортировка
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure QuickSortSeq(A: array of integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
SortSeq(A, 0, a.Length - 1)
|
|
|
|
|
|
end;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//заполнение массивов равными значениями для обоих сортировок
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure FillRandArr(A, B: array of integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
Randomize;
|
|
|
|
|
|
for var i := 0 to A.Length - 1 do
|
|
|
|
|
|
begin
|
|
|
|
|
|
a[i] := Random(1000);
|
|
|
|
|
|
b[i] := a[i];
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//Вывод массива
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure printArr(A: array of integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
Randomize;
|
|
|
|
|
|
for var i := 0 to A.Length - 1 do
|
|
|
|
|
|
writeln(a[i]);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
|
|
|
|
SetLength(a, 10000000);
|
|
|
|
|
|
SetLength(b, 10000000);
|
|
|
|
|
|
|
|
|
|
|
|
FillRandArr(a, b);
|
|
|
|
|
|
var m1 := Milliseconds;
|
|
|
|
|
|
QuickSortSeq(B);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Последовательное выполнение: ', Milliseconds - m1, 'ms');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
var m0 := Milliseconds;
|
|
|
|
|
|
QuickSortParrallel(a);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Параллельное выполнение: ', Milliseconds - m0, 'ms');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
end.
|