Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Pascal 2005 Часть2.doc
Скачиваний:
3
Добавлен:
27.08.2019
Размер:
846.34 Кб
Скачать

Метод стандартного обмена (пузырька)

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

При первом просмотре первый элемент сравнивается со вторым и больший из них занимает вторую позицию, затем второй элемент сравнивается с третьим и больший занимает третью позицию и т.д. Когда n-1 элемент сравнивается с n-ым и больший занимает последнюю позицию, первый просмотр заканчивается.

Второй просмотр аналогичен первому с той лишь разницей, что последний элемент исключается из рассмотрения.

Каждый последующий просмотр исключает очередную установленную позицию из рассмотрения, тем самым укорачивая вектор.

Просмотр

Исходный вектор А

1-ый

2 4 8 5 6 1

2 4 5 8 6 1

2 4 5 6 8 1

2 4 5 6 1 8

For i:=n-1 downto 1 do

For j:=1 to i do

If A[j]>A[j+1] then

begin

r:=A[j];

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

A[j+1]:=r;

end;

2-ой

2 4 5 6 1 8

2 4 5 1 6 8

3-ий

2 4 5 1 6 8

2 4 1 5 6 8

4-ый

2 4 1 5 6 8

2 1 4 5 6 8

5-ый

2 1 4 5 6 8

1 2 4 5 6 8

Метод просеивания

Метод просеивания работает точно также, как и метод стандартного обмена до тех пор, пока не нужно сделать перестановку. Пусть k – номер позиции переставляемого элемента. С позиции k начинается нисходящий просмотр элементов вектора в обратном порядке до тех пор, пока не нужно будет переставлять элементы вектора. Затем возобновляется восходящий просмотр элементов вектора с позиции k.

Таким образом, дойдя до последнего элемента вектора, получим упорядоченный список.

Исходный вектор А

2 4 8 5 6 1

2 4 5 8 6 1

2 4 5 8 6 1

2 4 5 6 8 1

2 4 5 6 1 8

2 4 5 6 1 8

2 4 5 1 6 8

2 4 1 5 6 8

2 1 4 5 6 8

1 2 4 5 6 8

For i:=1 to n-1 do

If A[i]>A[i+1] then

begin

r:=A[i];

A[i]:=A[i+1];

A[i+1]:=r;

j:=i;

While (A[j]<A[j-1]) and (j>1) do

begin

r:=A[j];

A[j]:=A[j-1];

A[j-1]:=r;

j:=j-1;

end;

end;