Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОМП. НАУКИ_1сем.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
902.14 Кб
Скачать
    1. Сортировка простым обменом (метод пузырька) Принцип сортировки обменом

В самом начале отсортированная часть массива пустая. В неотсортированной части справа налево выбираются и сравниваются пары соседних элементов. Если расположение в паре не соответствует условию упорядоченности, то элементы меняются местами.

Первый проход заканчивается тем, что самый «легкий» среди всех элементов «всплывает» на место с индексом 1. На втором проходе он уже не участвует, т.к. входит в отсортированную часть. Затем на место с индексом 2 «всплывает» самый легкий среди оставшихся неотсортированных элементов. Поэтому сортировку обменом называют еще «методом пузырька». Всего будет сделан N-1 проход.

Данный метод несимметричен: за один проход самый легкий элемент «всплывает» в начало массива, а более тяжелые сдвигаются на одну позицию к концу массива.

I=1 / 5 11 3 7 1 – исходный массив

I=2 1 / 5 11 3 7

I=3 1 3 / 5 11 7

I=4 1 3 5 / 7 11 – отсортированный массив

procedure BubbleSort(var A:vector); {Сортировка простым выбором, или метод "пузырька"}

var i,j,x: integer;

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;

    1. Сравнение эффективности базовых методов сортировки

При анализе эффективности подсчитывают количество операций сравнения и пересылки. Обозначим:

С – количество операций сравнения элементов массива,

М – количество операций перестановки. O(n) – количество операций порядка n, O(n2) – порядка n2.

Массив

Метод включения

Метод выбора

Метод обмена

С

М

С

М

С

М

Массив отсортирован

O(n)

O(n)

O(n2)

O(n)

O(n2)

0

Обычный массив

O(n2)

O(n2)

O(n2)

O(n log2 n)

O(n2)

O(n2)

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

O(n2)

O(n2)

O(n2)

O(n2)

O(n2)

O(n2)

  1. Сортировка простым включением: Наилучшая эффективность среди всех методов, если исходный массив частично отсортирован.

  2. Сортировка простым выбором: Наилучшая эффективность в среднем.

  3. Сортировка простым обменом («пузырек»): Наихудшая эффективность в среднем.

    1. Использование индексных массивов при сортировке

Любой метод сортировки включает две операции:

  • сравнение ключей, по которым идет сортировка;

  • перестановка элементов местами.

Все рассмотренные методы сортировок сортировали массивы, состоящие только из ключей.

Рассмотрим задачу сортировки строк матрицы по значениям первых элементов строк. Можно отказаться при сортировке от перестановки строк, заменив ее перестановкой индексов строк.

Ind

1

2

3

4

Матрица

5

1

1

3

2

2

12

3

3

7

4

4

Сортировка

Ind

2

1

4

3

Матрица

5

1

1

3

2

2

12

3

3

7

4

4

Выведенная матрица

3

2

2

5

1

1

7

4

4

12

3

3

Воспользуемся вспомогательным массивом Ind, который назовем индексным, т.к. он будет содержать индексы строк матрицы. Перед началом сортировки индексный массив заполняется последовательными номерами индексов Ind = 1 2 3...N.

Вместо перестановки строк, например, с индексами j-1 и j, будем переставлять элементы индексного массива Ind[j-1] и Ind[j].

Теперь результатом сортировки будет не отсортированная исходная матрица, а отсортированный массив индексов Ind, показывающий, в каком порядке следует брать строки исходной матрицы, чтобы получить отсортированную матрицу.

program Bubble_Ind_Sort; //Сортировка «пузырьком» с использованием индексного массива

Const m=10; n=50;

Var A: array[1..m;1..n] of integer;

Ind: array[1..m] of integer; //Длина индексного массива равна числу строк матрицы

i,j,x: integer;

begin

//Ввод данных в исходную матрицу A} . . . . . .

for i:=1 to m do Ind[i]:=i; //Начальное заполнение индексного массива

for i:=2 to m do //Начало сортировки

for j:=m downto i do

if A[Ind[j-1],1] >A[Ind[j],1]

then begin //Перестановка местами элементов индексного массива

x:=Ind[j-1];

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

Ind[j]:=x

end;

for i:=1 to m do //Вывод отсортированной матрицы по строкам

begin for j:=1 to n do

write(A[Ind[i], j]:6)

writeln

end

end.