Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB-2012 / 2-cеместр / Дневники / Методика / Лекция 2_4. Сортировка.doc
Скачиваний:
12
Добавлен:
26.03.2015
Размер:
332.29 Кб
Скачать
    1. Сортировка выбором

Сортировка выбором(selectionsort) — простой алгоритм со сложность порядка O(N2). Идея состоит в поиске наименьшего элемента в списке, который затем меняется местами с элементом на вершине списка. Затем находится наименьший элемент из оставшихся, и меняется местами со вторым элементом. Процесс продолжается до тех пор, пока все элементы не займут свое конечное положение.

При сортировке массива a[1], a[2], ..., a[n] методом простого выбора среди всех элементов находится элемент с наименьшим значением a[i], и a[1] и a[i] обмениваются значениями. Затем этот процесс повторяется для получаемых подмассивов a[2], a[3], ..., a[n], ... a[j], a[j+1], ..., a[n] до тех пор, пока мы не дойдем до подмассива a[n], содержащего к этому моменту наибольшее значение. Работа алгоритма иллюстрируется примером в таблице 1.

Таблица 1. Пример сортировки простым выбором

Начальное состояние массива

8 23 5 65 44 33 1 6

Шаг 1

1 23 5 65 44 33 8 6

Шаг 2

1 5 23 65 44 33 8 6

Шаг 3

1 5 6 65 44 33 8 23

Шаг 4

1 5 6 8 44 33 65 23

Шаг 5

1 5 6 8 33 44 65 23

Шаг 6

1 5 6 8 23 44 65 33

Шаг 7

1 5 6 8 23 33 65 44

Шаг 8

1 5 6 8 23 33 44 65

Для метода сортировки простым выбором требуемое число сравнений - nx(n-1)/2. Порядок требуемого числа пересылок (включая те, которые требуются для выбора минимального элемента) в худшем случае составляет O(n2). Однако порядок среднего числа пересылок есть O(n?ln n), что в ряде случаев делает этот метод предпочтительным.

Public Sub Selectionsort(List() As Long, min As Long, max As Long)

Dim i As Long

Dim j As Long

Dim best_value As Long

Dim best_j As Long

For i = min To max - 1

‘ Найти наименьший элемент из оставшихся.

best_value = List(i)

best_j = i

For j = i + 1 To max

If List(j) < best_value Then

best_value = List(j)

best_j = j

End If

Next j

‘ Поместить элемент на место.

List(best_j) = List(i)

List(i) = best_value

Next i

End Sub

При поиске I-го наименьшего элемента, алгоритму приходится перебрать N-I элементов, которые еще не заняли свое конечное положение. Время выполнения алгоритма пропорционально N + (N - 1) + (N - 2) + … + 1, или порядка O(N2).

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

If list(j) < best_value Then

best_value = list(j)

best_j = j

End If

Если первоначально список отсортирован в обратном порядке, условие list(j) < best_valueвыполняется большую часть времени. Например, при первом проходе оно будет истинно для всех элементов, поскольку каждый элемент меньше предыдущего. Алгоритм будет многократно выполнять строки с операторомIf, что приведет к некоторому замедлению работы алгоритма.

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