Метод Хоара - Быстрая сортировка (Quick-sort)

Слайд 2

Быстрая сортировка (англ. quicksort), часто называемая qsort (по имени в стандартной

Быстрая сортировка (англ. quicksort), часто называемая qsort (по имени в стандартной библиотеке языка

Си) — широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром во время его работы в МГУ в 1960 году.
QuickSort является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена, известного, в том числе, своей низкой эффективностью. Принципиальное отличие состоит в том, что в первую очередь производятся перестановки на наибольшем возможном расстоянии и после каждого прохода элементы делятся на две независимые группы. Любопытный факт: улучшение самого неэффективного прямого метода сортировки дало в результате один из наиболее эффективных улучшенных методов. 
Слайд 3

Общая идея алгоритма состоит в следующем: Выбрать из массива элемент, называемый

Общая идея алгоритма состоит в следующем: 
Выбрать из массива элемент, называемый опорным.

Это может быть любой из элементов массива. От выбора опорного элемента не зависит корректность алгоритма, но в отдельных случаях может сильно зависеть его эффективность.
Сравнить все остальные элементы с опорным и переставить их в массиве так, чтобы разбить массив на три непрерывных отрезка, следующие друг за другом: «меньшие опорного», «равные» и «большие».
Для отрезков «меньших» и «больших» значений выполнить рекурсивно ту же последовательность операций, если длина отрезка больше единицы.
На практике массив обычно делят не на три, а на две части: например, «меньшие опорного» и «равные и большие»; такой подход в общем случае эффективнее, так как упрощает алгоритм разделения.
Слайд 4

Program sort; uses crt; const N = 10; var A:array[0..N] of

Program sort;
uses crt;
const N = 10;
var A:array[0..N] of integer; { массив

элементов }
    q,i:integer;
procedure QuickSort( L, R : Integer ); 
var i,j,x,y : integer;
begin
  i := l; j := r;
  x := A[(l+r) div 2];{выбираем серединный эл-нт массива и делим массив пополам}
  repeat
    while (A[i] < x) do i:=i+1;{считываем всю левую часть до этого элемента}
    while (x < A[j]) do j:=j-1;{считываем всю правую часть до этого элемента}
    if ( i <= j ) then{Сортируем элементы массива}
    begin
      y:=A[i]; A[i]:=A[j]; A[j]:=y;
      i:=i+1; j:=j-1;
    end;
  until (i > j);
  if (l < j) then QuickSort(l,j);
  if (i < r) then QuickSort(i,r);
end;