3 Аспекта эффективности сортировок
– время, затрачиваемое на прохождение
–…на сортировку
–необходимый объём памяти
Усов. методы требуют n сравнений, простые – n2 сравнений. Для сортировок нельзя использовать массив B.
№20 ПРОСТЫЕ МЕТОДЫ СОРТИРОВОК:
ПРЯМОГО ВЫБОРА Основано на послед. поиске в исх. массиве эл-тов с min значением ключей. Сортировка осуществляется в n-1 проходов. Число сравнений С=n(n-1)/2. Проход – просмотр по задан. алгоритму сортируемой части массива с 1 эл-та до посл. Ключ с min значениями данный эл-т меняется местами с 1 эл-том. Затем выбор min продолжается на оставшегося n-1 элементах, ищется 2 min и т.д.
Procedure select;
Begin
for i:=l to n-1 do
begin
k:=i;
for j:=i+l to n do
if a[j]<a[k] then k:=j;
if k>1 then
begin
Prom:=a[i];
a[i]:=a[k];
a[k]:=Prom;
end end; End;
ОБМЕНА
Осн. на срав-и и смене мест при необходимости для пары соседних элементов до тех пор, пока не будут упор. все эл-ты. Ключи: Ai и Ai+1.Если Ai>Ai+1, то меняется местами. Число проходов n-1. Число сравнений С=n(n-1)/2. Улучшение: если в посл. проходе нет обмена массив отсортирован. Можно запоминать не только факт наличия обмена, но и индекс посл. обмена, то все индексы > данного эл-та отсортированы. Не симметрия алгоритма. При каждом проходе менять направление просмотра (Шейкер).
Procedure best bubble;
Var m,k:integer;
Begin
For i:=l to n-1 do
Begin
k:=0;
m:=n;
For j:=1 to m-1 do
Begin
If a[j]>a[j+l] then
Begin
обмен; k:=k+1;
End;
End;
m:=j;
if k=0 then break;
end;
end;
Procedure shaker sort;
Begin
S:= 1;
L:=i;
R:=n-1;
While s<>0 do
Begin
S:=0;
Fo i:=L to r do
If a[i]>a[i+l] then
Begin
T:=a[i];
a[i]:=a[i+l];
a[i+l]:=T;
s:=i;
end;
R:=s;
For i:=R downto L do
If a[i]> a[i+l] then
Begin
T:=a[i];
a[i]:=a[i+l];
a[i+l]:=T;
s:=i;
end;
L:=s;
End;
End; ВКЛЮЧЕНИЯ
Массив делится на 2 части – отсорт. и неотсорт. На каждом проходе, начиная с i=2,\ и увелич. i каждый раз на 1, из исходной последовательности извлекается i-ый эл-т и вставляется на нужное место.
Procedure Insert;
Begin
for i:=2 to n do
begin
x:=A[i];
j:=i; A[0]:=x; барьер
while x<A[j-l] do
begin
A[j]:=A[j-1];
j:=j-l;
End;
A[j]:=x;
End;
End;
Улучшение: лев. часть отсортир. место вставки можно искать с помощью двоичного поиска -