Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Itogovye_otvety_programmirovanie_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
202.75 Кб
Скачать

8 Сортировка простым выбором.

Этот метод основан на правиле: 1) выбирается эл-т с наименьшим ключом 2) он меняется местами с 1-м эл-ом а1 - эти операции затем повторяются с оставшимися с n-1 эл-ми, затем с n-2, пока не останется один – наибольший эл-т.

For I:=1 to n-1 do

Begin

Присвоить k индекс наименьшего эл-та из аi…аn .

Поменять местами аi и ak.

End;

Этот метод называется сортировка простым выбором в некотором смысле противоположен методу сортировки простым включением. Там рассма. только 1 эл-т входной последовательности и все эл-ты готового массива для нахождения места включения, а при Спвыбором рассматривает все эл-ты входного массива для нахождения эл-та с наименьшим ключом и этот 1 эл-т отправляется в готовую после-ть.

const n=20; type item= integer; index=0..n; var a:array [1..n] of item; I,j:index; x:item; begin for I:=1 to n-1 do begin k:=I; x:=a[I];

for j:=I+1 to n do if a[j]<x then begin k:=j;x:=a[j]; end a[k]:=a[I]; a[I]:=x; end; end;

Вывод: обычно Спвыбором предпочтительней СПвкл., хотя в случаи когда ключи заранее рассортированы или почти рассортированы СПвкл. Работает несколько быстрее.

9 Сортировка простым обменом (метод пузырька)

В этой сортировки обмен 2-х эл-тов является основной характеристикой процесса. Алгоритм основан на сравнии двух соседних эле-тов.

const n=20; type item= integer; index=0..n; var a:array [1..n] of item; I,j:index; x:item; begin for i:=2 to n do for j:=n downto i do

if a[j-1]>a[j] then begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; end; end;

Число сравнений и пересылок равняется N2.

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

10 Шейкер сортировка.

Если менять направление следующих друг за другом проходов в сортировки простым обменом (метод пузырька), то получается алгоритм Шейкер сортировки.

const n=20; var a:array [1..n] of integer; i,j,l,k,x,r:integer; begin l:=2; r:=n; k:=n; repeat for j:=r downto l do if a[j-1]>a[j] then begin

x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; k:=j; end; l:=k+1; for j:=l to r do if a[j-1]>a[j] then begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; k:=j; end;

r:=k-1 until l>r; end;

Число сравнений и пересылок равняется N2.

Алгоритм Шейкер сортировки можно использовать в тех случаях, когда Эл-ты почти упорядочены.

11 Сортировка включениями с убывающими приращениями (сортировка Шелла).

На 1-м проходе группируются и сортируются все эл-ты стоящие друг от друга на 4 позиции. Этот процесс называется четыре сортировкой. После этого эл-ты вновь определяются в группы с эл-ми стоящими друг от друга на две позиции и сортируются заново – это двухсортировка. Наконец все эл-ты сортируются обычной сортировкой (одинсортировкой).

Может показаться, что необходимость нескольких проходов сортировки в которых участвуют все эл-ты потребуют больше места, чем сэкономит. Однако на каждый шаг сортировки либо участвуют сравнительно мало эл-тов, либо они уже довольно хорошо упорядочены и требуют относительно малых перестановок. Применима любая последовательность приращений, либо последняя равна 1, т. к в худшем случае вся работа будет выполнятся на последнем проходе. Программа разрабатывается вне связи с конкретной последовательностью приращений. Все t приращения обозначаются h1,h2,…,ht

ht:=1, hi+1<hi

Каждая h сортировка программируется как сортировка простыми включениями. При этом

чтобы условия окончания поиска метода включения было простым, используется вместо барьера …. Очевидно, что каждая h сортировка требует собственного барьера и программа должна определять его как можно проще, поэтому массив нужно дополнять не одной компонентой а0, а h1 компонентами. Теперь массив описывается таким образом

а:array [-h1..n] of item

const t=4; var I,j,k,s:index; x:item; m:1..t; h:array [1..t] of integer; begin h[1]:=9; h[2]:=5; h[3]:=3; h[4]:=1; for m:=1 to t do

begin k:=h[m]; s:=-k; {место барьера} for i:=k+1 to n do begin x:=a[i]; j:=i-k; if s=0 then s:=-k; s:=s+1; a[s]:=x{определили барьер} while x<a[j] do begin a[j+k]:=a[j]; j:=j-k; end; end; a[j+k]:=x; end; end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]