Сортировка методом простого обмена (
методом "пузырька” ) является в среднем самой неэффективной. Это
обусловлено самой идеей метода, который требует в процессе сортировки
сравнивать и обменивать между собой только соседние элементы. Можно
существенно улучшить метод сортировки, основанный на обмене. Это
улучшение приводит к самому лучшему на сегодняшний день методу
сортировки массивов, который можно назвать обменной сортировкой с
разделением. Он основан на сравнениях и обменах элементов, стоящих на
возможно больших расстояниях друг от друга. Предложил этот метод Ч. А.
Р. Хоар в 1962 году. Поскольку производительность этого метода
впечатляюща, автор назвал его "быстрой сортировкой”.
Идея метода
1. В исходном неотсортированном массиве выбрать некоторый элемент x ( барьерный элемент ).
2.
Переставить элементы массива таким образом, что слева от x
оказались элементы массива, меньшие или равные x, а справа - элементы
массива, большие x.
Пусть при этом элемент x попадет в позицию k,
тогда массив будет иметь вид: ( a[1], a[2], ... , a[k-1] ), a[k], (
a[k+1], ... , a[n] ).
Каждый из элементов a[1], a[2], ... , a[k-1] меньше либо равен a[k], каждый из элементов a[k+1], ... , a[n] больше a[k]. Отсюда можно сделать вывод, что элемент a[k] стоит на своем месте. А исходный массив при этом разделится на две неотсортированные части, барьером между которыми является элемент a[k].
Для дальнейшей сортировки необходимо применить пункты 1 и 2 для каждой из этих частей. И так до тех пор, пока не останутся подмассивы, состоящие из одного элемента, то есть пока не будет отсортирован весь массив.
Алгоритм "быстрой сортировки” можно
определить как рекурсивную процедуру, параметрами которой являются
нижняя и верхняя границы изменения индексов сортируемой части исходного
массива:
program n5;var a: array[1..10] of integer;procedure Init;
{формирование массива из фала}
var f: text;
i: integer;
begin
Assign(f,'g:\s.dat');
Reset(f);
for i:=1 to 10 do read(f,a[i]);
close(f);
end;
procedure Print; {печать массива}
var i: integer;
begin
for i:=1 to 10 do write(a[i]:5);
writeln;
end;
procedure Quik_sorting(m,l: integer);
var i,j,x,w: integer;
begin
i:=m;
j:=l;
x:=a[(m+l) div 2];
repeat
while a[i] while a[j]>x do dec(j);
if i<=j then
begin
w:=a[i]; a[i]:=a[j]; a[j]:=w;
inc(i);
dec(j);
end;
until i>j;
if m if iend;
begin {основная программа}
writeln('Массив:');
init;
print;
Quik_sorting(1,10);
writeln('отсортированный массив');
print;
end.