Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Сортировка обменом («пузырьковая сортировка»)
Слева направо поочередно сравниваются два соседних элемента, и если их взаиморасположение не соответствует заданному условию упорядоченности, то они меняются. Далее берутся два следующих соседних элемента и так далее до конца массива. После одного такого прохода на последний n-ой позиции массива будет стоять максимальный элемент («всплыл первый пузырек»). Поскольку максимальный элемент уже стоит на своей последней позиции, то второй проход обменов выполняется до n-1 элемента. И так далее. Всего требуется n-1 проход.
1 шаг: 3 11 7 11 2 11 9 11 2 шаг: 1 11 4 11
3 5 1 7 4 7 3 шаг: 2 7 1 5 4 5 4 шаг: 2 5 1 3 2 4 5 шаг:
2 3 6 шаг:
7 шаг:
Результат:
БЛОК – СХЕМА
Æ 1
Æ 1
Программа реализирующая метод обмена («пузырька»), будет иметь следующий вид: Program Duddle Sort; Uses Crt; Const N = 20; { длина массива} Type TVector = array [1…n] of Real; Var Vector: Tvector; B: Real; i, K: Integer; begin ClrScr; Writeln (‘введите элементы массива: ’); for i: = 1 to n do Read (Vector [i]); Readln; {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } for K: = n downto 2 do {“всплывание” очередного максимального элемента} {на К-ю позицию} for i: = 1 to K-1 do if Vector [i] > Vector [i+1] then begin B: = Vector [i]; Vector [i]: = Vector [i+1]; Vector [i+1]: = B; End; {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } Writeln (‘отсортированный массив: ’); For i: = 1 to n do Write (‘Vector [i]: 8: 2’); Writeln; End.
Результат работы:
Сортировка фон Неймана (слиянием) Заданы два упорядоченных по возрастанию элементов одномерных массива: а размерности n и b размерности m. Требуется получить третий массив с размерности n+m, который содержал бы все элементы исходных массивов, упорядоченных по возрастанию. Алгоритм решения этой задачи известен как «сортировка фон Неймана» или сортировка слиянием. Идея алгоритма состоит в следующем. Сначала анализируются первые элементы обоих массивов. Меньший элемент переписывается в новый массив. Оставшийся элемент последовательно сравнивается с элементами из другого массива. В новый массив после каждого сравнения попадает меньший элемент. Процесс продолжается до исчерпания элементов одного из массивов. Затем остаток другого массива дописывается в новый массив. Полученный новый массив упорядочен таким же образом, как исходные.
Программа, реализующая метод Фон-Неймана, имеет следующий вид:
БЛОК – СХЕМА
Æ 1
1 Æ
1 Æ 1 Æ
program confluence; const n = 10; m = 20; l = n + m; var x: array [1..n] of integer; y: array [1..m] of integer; z: array [1..l] of integer; k, i, j: integer; begin for i: = 1 to n do read (x[i]); {формирование первого упорядоченного массива} for i: = 1 to m do read (y[i]); {формирование второго упорядоченного массива} I: = 1; j: =1; l: =1 {i-индекс первого массива, j-индекс второго массива, l-индекс результирующего массива} while (i< =n) and (j< =m) do {пока не закончились элементы в одном из массивов} if x[i] < y[i] then {переписываем элементы из первого массива} begin z[k]: = x[i]; i: = i + 1; k: = k + 1; end else {переписываем элемент из второго массива} begin z[k]: = y[j]; j: = j + 1; k: = k + 1; end; while i < = n do {если не закончились элементы в первом массиве, } begin {переписываем их в результирующий массив} z[k]: = x[i]; i: = i + 1; k: = k+1; end; while j < = m do {если не закончились элементы во втором массиве} begin {переписываем их в результирующий массив} z[k]: = y[j]; j: = j + 1; k: = k+ 1; end; for i: = 1 to l do {вывод на экран упорядоченного массива, } writeln (z[i]); {полученного слиянием} End. Результаты работы:
Шейкер-сортировка Шейкер — сортировка является модификацией сортировки методом пузырька. Здесь, как и в методе пузырька проводят попарное сравнение элементов и обменов в паре. Если имеется необходимость, но первый проход осуществляют снизу вверх, второй – сверху вниз и т.д. Иными словами меняется направление прохода. program sheyker; uses crt; const n=30; var a: array[1..n]of integer; x, j, i, u: integer; h: boolean; begin clrscr; writeln('Массив до сортировки: '); for i: =1 to n do begin a[i]: =round(random*999); write(a[i], '-'); end; writeln; writeln('Массив после сортировки: '); h: =true; u: =n; i: =2; repeat if h then begin for j: =u downto i do if a[j-1]> a[j] then begin x: =a[j-1]; a[j-1]: =a[j]; a[j]: =x; h: =false; end; u: =u-1; end else begin for j: =i to u do if a[j+1]< a[j] then begin x: =a[j+1]; a[j+1]: =a[j]; a[j]: =x; h: =true; end; i: =i+1; end; until u=i; for i: =1 to n do write(a[i], '-'); readln; end.
Результаты выполнения программы:
Двумерные массивы. Популярное:
|
Последнее изменение этой страницы: 2016-03-15; Просмотров: 23612; Нарушение авторского права страницы