Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и алгоритмы / Сортировка_Основные алгоритмы.doc
Скачиваний:
113
Добавлен:
23.02.2015
Размер:
679.94 Кб
Скачать
    1. Сортировка выбором

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

Будем строить готовую последовательность, начиная с левого конца массива. Алгоритм состоит из nпоследовательных шагов, начиная от нулевого и заканчивая(n-1)-м.

На i-м шаге выбираем наименьший из элементовa[i] ... a[n]и меняем его местами сa[i].Последовательность шагов приn=5изображена на рис. 4.

4

9

7

6

2

3

2

9

7

6

4

3

2

3

7

6

4

9

Исходная последовательность

Шаг 0: 2 4

Шаг 1: 3 9

2

3

4

6

7

9

2

3

4

6

7

9

2

3

4

6

7

9

Шаг 2: 4 7

Шаг 3: 6 6

Шаг 4: 7 7

Рис. 4

Вне зависимости от номера текущего шага iпоследовательностьa[0]...a[i](выделена на рисунке курсивом) является упорядоченной. Таким образом, на(n-1)-м шаге вся последовательность, кромеa[n]оказывается отсортированной, аa[n]стоит на последнем месте по праву: все меньшие элементы уже ушли влево.

template<class T>

void selectSort(T a[], long size) {

long i, j, k;

T x;

for( i=0; i < size; i++) { // i - номер текущего шага

k=i; x=a[i];

for( j=i+1; j < size; j++) // цикл выбора наименьшего элемента

if ( a[j] < x ) {

k=j; x=a[j]; // k - индекс наименьшего элемента

}

a[k] = a[i]; a[i] = x; // меняем местами наименьший с a[i]

}

}

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

n + (n-1) + (n-2) + (n-3) + ... + 1 = 1/2 * (n2+n) =О(n2).

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

Алгоритм не использует дополнительной памяти: все операции происходят "на месте".

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

1

a

1

b

1

c

1

a

1

b

1

c

Исходная последовательность

Шаг 0: 2 1

Рис. 5.

Результат сортировки такой последовательности можно увидеть уже после шага 0, так как больше обменов не будет. Порядок ключей 2a, 2b был изменен на 2b, 2a, поэтому метод неустойчив.

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