2015-12-28 14:25:15 +03:00
|
|
|
|
// Быстрая сортировка Ч. Хоара
|
2015-05-14 22:35:07 +03:00
|
|
|
|
uses ArrayLib;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Быстрая сортировка
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure QuickSort(a: array of integer);
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Разделение a[l]..a[r] на части a[l]..a[q] <= a[q+1]..a[r]
|
2015-05-14 22:35:07 +03:00
|
|
|
|
function Partition(l,r: integer): integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
var i := l - 1;
|
|
|
|
|
|
var j := r + 1;
|
|
|
|
|
|
var x := a[l];
|
|
|
|
|
|
while True do
|
|
|
|
|
|
begin
|
|
|
|
|
|
repeat
|
|
|
|
|
|
Inc(i);
|
|
|
|
|
|
until a[i]>=x;
|
|
|
|
|
|
repeat
|
|
|
|
|
|
Dec(j);
|
|
|
|
|
|
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
|
|
|
|
/// Сортировка частей
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure sort(l,r: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if l>=r then exit;
|
|
|
|
|
|
var j := Partition(l,r);
|
|
|
|
|
|
sort(l,j);
|
|
|
|
|
|
sort(j+1,r);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
sort(0,a.Length-1)
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
const n = 20;
|
|
|
|
|
|
|
|
|
|
|
|
var a: array of integer;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
CreateRandom(a,n);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('До сортировки: ');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
WriteArray(a);
|
|
|
|
|
|
QuickSort(a);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('После сортировки: ');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
WriteArray(a);
|
|
|
|
|
|
end.
|