Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

9.Сортировка подсчетом.

Сортировка подсчётом — алгоритм сортировки, в котором используется диапазон чисел сортируемого массива (списка) для подсчёта совпадающих элементов. Применение сортировки подсчётом целесообразно лишь тогда, когда сортируемые числа имеют (или их можно отобразить в) диапазон возможных значений, который достаточно мал по сравнению с сортируемым множеством, например, миллион натуральных чисел меньших 1000. Эффективность алгоритма падает, если при попадании нескольких различных элементов в одну ячейку, их надо дополнительно сортировать. Необходимость сортировки внутри ячеек лишает алгоритм смысла, так как каждый элемент придётся просматривать более одного раза.

Пусть, к примеру, имеется массив A из миллиона натуральных чисел, меньших 100. Тогда можно создать вспомогательный массив B из 99 (1..99) элементов, «пробежать» весь исходный массив и вычислять частоту встречаемости каждого элемента — то есть если A[i]=a, то B[a] следует увеличить на единицу. Затем «пробежать» счетчиком i массив B, записывая в массив A число i B[i] раз.

type

mass = array[1..1000] of longint;

rez = array[1..9]{"A".."Z"} of longint;

var

a, b, k: longint;

d: mass;

e: rez;

procedure count(inp: mass; var outp: rez; n: longint);

var

i: longint;

begin

for i := 1 to n do

inc(outp[inp[i]]);

end;

begin

read(a);

for b := 1 to a do

read(d[b]);

count(d, e, a);

for b := 1 to a do

for k := 1 to e[b] do

write(b, ' ');

end.

10.Сортировка простым обменом

Принцип метода:

Слева направо поочередно сравниваются два соседних элемента, и если их взаимное расположение не соответствует заданному условию упорядоченности, то они меняются местами. Далее берутся два следующих соседних элемента и так далее до конца массива.

После одного такого прохода на последней n-ой позиции массива будет стоять максимальный (или минимальный) элемент ("всплыл" первый "пузырек"). Поскольку максимальный (или минимальный) элемент уже стоит на своей последней позиции, то второй проход обменов выполняется до (n-1)-го элемента. И так далее. Всего требуется (n-1) проход.

Рассмотрите процедуру, реализующую выше рассмотренный алгоритм:

Procedure Obmen(Var a : Array1);

Var

i,j,f,g:integer;

Begin

for i:=n downto 2 do

for j:=1 to i-1 do

if a[j]>a[j+1]

then

begin

f:=a[j];

a[j]:=a[j+1];

a[j+1]:=f;

end;

End;

11. Методы внутренней сортировки: «Шейкер-сортировка»

Сортировка шейкером, чаще всего, применяется для упорядочивания очень больших массивов, которые возможно находятся на жёстком диске. Этот алгоритм за один проход цикла выбирает наибольший и наименьший алгоритм и помещает их соответственно в начало и конец списка. Затем операция повторяется и сортируются остальные элементы. Таким образом для сортировки всего массива понадобиться N\2 проходов цикла.

Код алгоритма должен выглядеть примерно так:

Листинг 4. Сортировка подсчётом

procedure ShakerSort( var ar: array of integer; min, max: Integer);

var

n, i, j, tmp: Integer;

begin

n:=max;

for i:=1 to (n div 2) do begin

if ar[i]>ar[i+1] then begin

min:=i+1;

max:=i;

end

else begin

min:=i;

max:=i+1;

end;

for j:=i+2 to (n-i+1) do

if ar[j]>ar[Max] then

max:=j

else if ar[j]<ar[Min] then

min:=j;

// end; else if

// end; for

{Обмен элементов}

tmp:=ar[i];

ar[i]:=ar[min];

ar[min]:=tmp;

if max=i then

max:=min;

// end; if

tmp:=ar[n-i+1];

ar[n-i+1]:=ar[max];

ar[max]:=tmp;

end;

end;