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

Содержание

Слайд 2

Задача сортировки (sorting problem)

Задача сортировки (sorting problem)

Слайд 3

Сортировка выбором. Selection Sort. На каждой итерации i, найти индекс (min

Сортировка выбором. Selection Sort.

На каждой итерации i, найти индекс

(min ) минимального значения
поменять местами элементы a[i] и a[min] - swap (a[i], a[min])

Идея алгоритма

(см. Example5, Project SelectionSort)

i

min

i

min

i

min

i

min

i

min

Слайд 4

Сортировка выбором. Реализация. (см. Example5, Project SelectionSort) 1. перемещаемся по массиву

Сортировка выбором. Реализация.

(см. Example5, Project SelectionSort)

1. перемещаемся по массиву вправо
i++;

2. находим

индекс минимального в правой части массива
int min=i;
for (int j=i+1; j if ( less(a[j], a[min]) )
min=j;

3. меняем местами элементы i-ый и min
swap(a, i, min);

Слайд 5

Сортировка выбором. Анализ. Сравнений: (N-1)+(N-2)+…1+0 ~ N2/2 Перестановок: N Сложность алгоритма:

Сортировка выбором. Анализ.

Сравнений: (N-1)+(N-2)+…1+0 ~ N2/2

Перестановок: N

Сложность алгоритма: O(N2)

Время работы

алгоритма: не зависит от порядка расположения исходных данных. Квадратичное, даже если исходный массив отсортирован.

Плюсы: Количество перестановок минимально

Минусы: Очень высокая вычислительная сложность O(N2)

Слайд 6

Сортировка вставками. Insertion Sort. двигаемся по массиву элементов слева на право

Сортировка вставками. Insertion Sort.

двигаемся по массиву элементов слева на

право
на каждой итерации i меняем местами a[i] с каждым элементом слева от a[i] и большим его

Идея алгоритма

(см. Example5, Project InsertionSort)

Слайд 7

Сортировка вставками. Demo. i j i j i j i j

Сортировка вставками. Demo.

i

j

i

j

i

j

i

j

i

j

i

j

i

j

i

j

Слайд 8

Сортировка вставками. Реализация. 1. перемещаемся по массиву слева направо i++; 2.

Сортировка вставками. Реализация.

1. перемещаемся по массиву слева направо
i++;

2. двигаемся справа-налево от

i-го элемента и меняем местами с каждым, большим a[i]
for (int j=i; j>0; j--)
if ( less(a[j], a[j-1]) )
swap(a, j, j-1);
else break;
Слайд 9

Сортировка вставками. Анализ. Сравнений: ~1/4 N2 в среднем Перестановок: ~1/4 N2

Сортировка вставками. Анализ.

Сравнений: ~1/4 N2 в среднем

Перестановок: ~1/4 N2 в

среднем

Сложность алгоритма: O(N2)

Наилучший случай: если массив отсортирован, то алгоритм выполняет N-1 сравнение и 0 перестановок.
Наихудший случай: если массив отсортирован в обратном порядке, то алгоритм выполняет ~1/2 N2 сравнений и ~1/2 N2 перестановок

Плюсы:
эффективен на небольших наборах данных (до десятков элементов)
эффективен на частично-отсортированных наборах данных

Минусы: Очень высокая вычислительная сложность O(N2)

Слайд 10

Сортировка простыми обменами. Bubble Sort. Алгоритм состоит из повторяющихся проходов по

Сортировка простыми обменами. Bubble Sort.

Алгоритм состоит из повторяющихся проходов

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

Идея алгоритма

(см. Example5, Project BubbleSort)

Слайд 11

Bubble sort. Demo. Swap (6,9) Don’t swap Swap (2,4) Swap (2,8)

Bubble sort. Demo.

Swap (6,9)

Don’t swap

Swap (2,4)

Swap (2,8)

Конец 1-го прохода

Конец 2-го прохода

Слайд 12

Bubble Sort. Реализация. 1. Выполняем i-ый проход, перестановок не было int

Bubble Sort. Реализация.

1. Выполняем i-ый проход, перестановок не было
int i=0; bool

swapped=false;

2. Сравниваем все пары соседних элементов a[j], a[j-1]. Если порядок нарушен, выполняем перестановку
for (int j=n-1; j>i; j--)
if ( less(a[j], a[j-1]) )
{
swap(a, j, j-1);
swapped=true;
}

2. Сравниваем все пары соседних элементов a[j], a[j-1]. Если порядок нарушен, выполняем перестановку
for (int j=n-1; j>i; j--)
if ( less(a[j], a[j-1]) )
{
swap(a, j, j-1);
swapped=true;
}

3. Если перестановок не было, то завершаем проходы, иначе следующий проход (i++)
if (!swapped) break;