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

6.2.4. «Шейкер» - сортировка

Несмотря на все сделанные выше усовершенствования, "пузырьковая" сортировка следующего (почти упорядоченного!) массива 5, 7, 12, 17, 28, 36, 85, 2 будет проведена за 7 проходов. Это связано с тем, что при сортировке, рассматриваемым методом, за один проход элемент не может переместиться влево более чем на одну позицию. Таким образом, если минимальный элемент массива находится в его правом конце (как в рассматриваемом примере), то придется выполнить максимальное число проходов. Поэтому естественно напрашивается еще одно улучшение метода "пузырьковой" сортировки — попеременные проходы массива в обоих направлениях, а не только от его начала к концу. В этом случае время сортировки может несколько сократиться. Такой метод сортировки называется "шейкер" - сортировкой (от английского слова shakeтрясти, встряхивать). Его работа показана на схеме на примере сортировки массива из 6 элементов: 67, 6, 18, 80, 34, 4. Стрелками указано направление прохода в массиве.

6 7 6

6 67 18

18 67

8 0 34

3 4 80 4

4 80

6 4

1 8 4 6

6 7 4 18

3 4 4 67

4 34

80

4

6

18

6 7 34

34 67

80

4

6

18

34

67

80

В процедуре, реализующей "шейкер" - сортировку, будем использовать две величины: l — левая граница (индекс) участка массива, обрабатываемого на каждом проходе; r – правая граница участка массива, обрабатываемого на каждом проходе. Процесс упорядочения массива будем проводить, пока выполняется условие l < r и не было ни одного обмена в обрабатываемой части массива.

Program Sort_Bull_2; {сортировка методом "пузырька"}

uses Сrt;

const n=10; {длина массива}

type

Mas = array [1..n] of real;

var

M : mas; В :real ;

l, r, i: integer; {счетчик}

Flag: boolean;

begin

СlrScr;

Writeln('Bвeдитe элементы массива');

for i :=1 to n do Read (M[ i ]) ;

Readln;

{начало сортировки}

flag : = true ;

l:=1; r:=n;

while (l<r) and flag do

begin

flag :=false;

for i:=1 to r-1 do {Проход "слева направо"}

if M[i] > M[i+l] then

begin

B := M[i] ;

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

M[i+1] := B

flag:= true;

end { if . . .then }

r := r-1

for i:=r downto l+1 do {Проход "справа налево"}

if M[i] < M[i-1] then

begin

B := M[i] ;

M[i] := M[i-1] ;

M[i-1] := B

flag:=true;

end { if . . .then }

l:=l+1;

end;

{печать отсортированного массива}

for i : = 1 to n do

Wгite (M[i] : 8 : 2 );

Writeln

End.

6.2.5. Алгоритм сортировки вставками

Теория метода:

Массив разделяется на две части: отсортированную и неотсортированную. Элементы из неотсортированной части поочередно выбираются •вставляются в отсортированную часть так, чтобы не нарушить в ней упорядоченность элементов. В начале работы алгоритма в качестве отсортированной части массива принимают только один первый элемент, а в качестве неотсортированной части — все остальные элементы.

Таким образом, алгоритм будет состоять из n-1-го прохода ( n — размерность массива), каждый из которых будет включать следующие действия:

  • взятие очередного неотсортированного элемента и сохранение его в дополнительной переменной;

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

  • вставка взятого элемента в найденную позицию.

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

38 12 80 15 36 23 74 62 исходный массив

3 8 12 80 15 36 23 74 62 1 - й этап

1 2 38 80 15 36 23 74 62 2 - й этап

1 2 38 80 15 36 23 74 62 3 - й этап

1 2 15 38 80 36 23 74 62 4 - й этап

1 2 15 36 38 80 23 74 62 5 - й этап

1 2 15 23 36 38 80 74 62 6 - й этап

1 2 15 23 36 38 74 80 62 7 - й этап

12 15 23 36 38 62 74 80

На первом этапе выбирается второй элемент и сравнивается с первым. Поскольку первый элемент больше рассматриваемого, то на его место ставится второй (рассматриваемый) элемент, а сам первый элемент перемещается на одну позицию вправо (т. е. на место второго). Остальная часть последовательности остается без изменения. На втором этапе выбирается третий элемент (80) и сравнивается с двумя упорядоченными ранее. Так как он больше этих элементов, то остается на месте. Затем из неупорядоченной последовательности выбирается четвертый элемент (15). Так как он меньше второго элемента упорядоченной последовательности (38), то перемещается на второе место, при этом второй и третий элементы смещаются на одну позицию вправо. Подобным образом последовательность меняется до тех пор, пока не станет упорядоченной (в нашем случае это достигается на седьмом этапе).

Размещение элемента массива на соответствующем ему месте в предшествующей, уже упорядоченной последовательности может быть проведено двумя способами:

  • последовательно сравнивать рассматриваемый элемент с элементом, расположенным слева от него, и обменивать их местами до тех пор, пока слева от перемещаемого элемента не окажется элемент, меньший его (m[j]<b) и пока не достигнут левый конец упорядоченной части массива. Такой способ называют «сравнение и обмен».

  • сначала определить место, соответствующее рассматриваемому элементу в упорядоченной последовательности, затем сдвинуть элементы массива вправо, чтобы освободить найденную позицию вставки и далее вставить рассматриваемый элемент. Эту разновидность размещения называют «поиск места и вставка»

Размещение путем сравнения и обмена (1-й способ)

Program sort_vstav1;

const n=10;

type mas = array [1..n] of integer;

var m: mas;

b: integer;

i,j: integer;

begin

Writeln('vvod');

for i:=1 to n do

read(m[i]); readln;

for i:=2 to n do

begin

b:=m[i]; { Взятие неотсортированного элемента }

j:=i-1;

{ Цикл поиска позиции вставки в отсортированном массиве }

while (j>0) and (m[j]>=b) do

begin

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

dec(j)

end;

m[j+1]:=b; {Вставка взятого элемента на найденную позицию}

end;

for i:=1 to n do {печать отсортированного массива}

writeln (m[i]:4)

end.

Размещение путем поиска места и вставки (2-й способ)

Program sort_vstav2;

uses Crt;

const n = 10; { длина массива }

type

mas = array [1..n] of Real;

var

m : mas;

В : Real;

i, j, k : Integer;

begin

ClrScr;

Writeln ('Введите элементы массива:');

for i := 1 to n do Read (m[i]) ; Readln;

{начало сортировки}

for i:= 2 to n do

begin

В := m[i]; { Взятие неотсортированного элемента }

{ Цикл поиска позиции вставки в отсортированном массиве }

j := 1;

while (В > m[j]) do

j := j + 1; { После окончания цикла индекс j фиксирует позицию вставки }

{ Цикл сдвига элементов для освобождения позиции вставки }

for k := i-1 downto j do

m[k+1] := m[k] ;

m[j] := В; {Вставка взятого элемента на найденную позицию}

end;

{печать отсортированного массива}

for i := 1 to n do

Write (m[i]:8:2); Writeln; end.

Задачи для самостоятельного решения.

  1. Задан массив А(N). Упорядочить его в порядке возрастания от начала до элемента, содержащего максимум.

  2. Задан массив А(N). Расположить его в порядке убывания абсолютных величин. Элементы равные нулю, оставить на своих местах.

  3. Задан массив А(N). Упорядочить его элементы, стоящие до максимума, в порядке возрастания, а после максимума в порядке убывания.

  4. Задан массив А(N). Упорядочить его элементы, стоящие до элемента содержащего минимум по убыванию, а после минимума по возрастанию.

  5. Задан массив А(N). Упорядочить в порядке возрастания элементы массива, имеющие четный индекс.

  6. Задан массив А(N). Упорядочить в порядке убывания нечетные элементы массива.

  7. Задан массив А(N). Упорядочить в порядке неубывания элементы массива, стоящие между первым нечетным отрицательным значением и последним четным положительным значением.

  8. Задан массив А(N). Упорядочить в порядке невозрастания элементы массива, стоящие между первым максимальным значением и последним минимальным значением.

  9. Дана матрица целых чисел А(N,M). Отсортировать четные строки двумерного массива по возрастанию, а нечетные - по убыванию.

  10. Дана матрица целых чисел А(N,M). Отсортировать столбцы матрицы, содержащие минимальный и максимальный элементы по возрастанию.

  11. Дана квадратная матрица целых чисел. Упорядочить строки матрицы в порядке неубывания количества нулевых элементов в строке.

  12. Дана квадратная матрица целых чисел. Упорядочить столбцы матрицы в порядке невозрастания суммы элементов в столбце.

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