В основе алгоритма
лежит обмен соседних элементов массива. Каждый элемент массива, начиная с первого,
сравнивается со следующим, и если он больше следующего, то элементы меняются
местами. Таким образом, элементы с меньшим значением продвигаются к началу массива
(всплывают), а элементы с большим значением — к концу массива (тонут). Поэтому
данный метод сортировки обменом иногда называют методом "пузырька".
Этот процесс повторяется столько раз, сколько элементов в массиве, минус единица.
На рис. 5.17 цифрой
1 обозначено исходное состояние массива и перестановки на первом проходе, цифрой
2 — состояние после перестановок на первом проходе и перестановки на втором
проходе, и т. д.
Рис. 5.17.
Процесс сортировки массива
Рис. 5.18. Диалоговое
окно программы Сортировка методом обмена
На рис. 5.18 приведено
диалоговое окно программы сортировки массива методом обмена.
Процедура сортировки,
текст которой приведен в листинге 5.10, запускается нажатием кнопки Сортировка
(Button1). Значения элементов массива вводятся из ячеек компонента stringGrid1.
Во время сортировки, после выполнения очередного цикла обменов элементов массива,
программа выводит массив в поле метки Label2.
Листинг 5.10.
Сортировка массива методом обмена
procedure
TForm1.Button1Click(Sender: TObject);
const
SIZE=5;
var
a:array[1..SIZE]
of integer;
k:integer;
// текущий элемент массива
i:integer;
// индекс для ввода и вывода массива
changed:boolean;
// TRUE, если в текущем цикле были обмены
buf:integer;
// буфер для обмена элементами массива
begin
// ввод массива
for
i:=1 to SIZE do
a[i] := StrToInt(StringGrid1.Cells[i-1, 0] );
label2.caption:='';
//
сортировка массива repeat
Changed:=FALSE; // пусть в текущем цикле нет обменов
for
k:=l to SIZE-1 do
if
a[k] > a[k+l] then
begin // обменяем k-й и k+1-й элементы
buf
:= a[k]; a[k] := a[k+l]; a[k+l] := buf;
changed := TRUE;
end;
// вывод массива
for
i:=l to SIZE do
Label2.caption:=label2.caption+' '+IntTostr(a[i]);
Label2.caption:=label2.caption+#13;
until not changed; // если не было обменов, значит
//
массив отсортирован
Label2.caption:=label2.caption
+#13+'Maccив отсортирован.';
end;
Следует отметить, что
максимальное необходимое количество циклов проверки соседних элементов массива
равно количеству элементов массива минус один. Вместе с тем возможно, что массив
реально будет упорядочен за меньшее число циклов. Например, последовательность
чисел 5 1 2 3 4, если ее рассматривать как представление массива, будет упорядочена
за один цикл, и выполнение оставшихся трех циклов не будет иметь смысла.
Поэтому в программу
введена логическая переменная changed, которой перед выполнением очередного
цикла присваивается значение FALSE. Процесс сортировки (цикл repeat) завершается,
если после выполнения очередного цикла проверки соседних элементов массива (цикл
for) ни один элемент массива не был обменен с соседним, и, следовательно, массив
уже упорядочен.
Рис. 5.19.
Пример работы программы сортировки массива методом обмена
На рис. 5.19 приведено диалоговое окно программы сортировки массива методом обмена после завершения процесса сортировки.
Дело в том, что в его постановке и выводах произведена подмена, аналогичная подмене в школьной шуточной задачке на сообразительность, в которой спрашивается:
- Cколько яблок на березе, если на одной ветке их 5, на другой ветке - 10 и так далее
При этом внимание учеников намеренно отвлекается от того основополагающего факта, что на березе яблоки не растут, в принципе.
В эксперименте Майкельсона ставится вопрос о движении эфира относительно покоящегося в лабораторной системе интерферометра. Однако, если мы ищем эфир, как базовую материю, из которой состоит всё вещество интерферометра, лаборатории, да и Земли в целом, то, естественно, эфир тоже будет неподвижен, так как земное вещество есть всего навсего определенным образом структурированный эфир, и никак не может двигаться относительно самого себя.
Удивительно, что этот цирковой трюк овладел на 120 лет умами физиков на полном серьезе, хотя его прототипы есть в сказках-небылицах всех народов всех времен, включая барона Мюнхаузена, вытащившего себя за волосы из болота, и призванных показать детям возможные жульничества и тем защитить их во взрослой жизни. Подробнее читайте в FAQ по эфирной физике.