Сортировка – один из наиболее сложных и важных для изучения алгоритмов.
Во-первых, сортировка – это общая задача многих компьютерных приложений. Практически любой список ценнее, когда он отсортирован по какому-либо определенному принципу.
Во-вторых, многие алгоритмы сортировки являются интересными примерами программирования, демонстрирующих важные методы: частное упорядочивание, рекурсия, объединение списков, сохранение двоичных деревьев в массивах.
У каждого алгоритма сортировки есть свои преимущества и недостатки. Производительность различных алгоритмов зависит от типа данных, начального расположения, размера и значений. Важно выбрать тот алгоритм, который лучше всего подходит для решения конкретной задачи.
Сортировка – одна из немногих задач с точными теоретическими границами производительности. Любой алгоритм сортировки, который использует сравнения, занимает по крайней мере, O(N*logN) времени.
Сортировка выбором – это простой алгоритм O(N2). Его задача – искать наименьший элемент, который затем меняется местами с элементом из начала списка. Затем находится из оставшихся элементов и меняется местами со вторым элементом. Процесс продолжается до тех пор, пока все элементы не займут свое конечное положение.
2 4 5 3 10 8 1
a1 a2 a3 a4 a5 a6 a7
Определяется наименьший элемент a7=1
Меняется местами с первым 1 4 5 3 10 8 2
В оставшемся снова ищется минимальный и меняется со вторым 1 2 5 3 10 8 4
For i = 1 To n - 1
Min = a(i)
k_min = i
For j = i + 1 To n
If a(j) < Min Then
Min = a(j)
k_min = j
End If
Next
a(k_min) = a(i)
a(i) = Min
Next
Для реализации этого алгоритма необходимы вложенные циклы For. Внешний цикл (по I) предназначен для последовательного фиксирования элементов массива, внутренний (по J) - осуществляет поиск минимума (максимума) и его позиции. После выхода из внутреннего цикла следует перестановка элементов. Последний элемент во внешнем цикле не рассматривается: он сам встанет на свое место.
При поиске i-го наименьшего элемента алгоритм должен проверить каждый из N-I оставшихся. Время выполнения алгоритма равно N+(N-1)+(N-2)+…+1 или O(N2).
Сортировка выбором работает достаточно хорошо со списками, где элементы расположены случайно или в прямом порядке, но для обратно сортированных списков производительность этого алгоритма немного хуже. Для поиска минимального элемента списка сортировка выбором выполняет следующую последовательность операторов:
If a(j) < Min Then
Min = a(j)
k_min = j
End If
Если список отсортирован в обратном порядке, условие a(j) < Min выполняется большую часть времени. Во время первого прохода через список элементов, оно будет истинно для всех элементов, потому что каждый элемент меньше, чем предыдущий. Программа выполняет сравнение много раз, что приводит к некоторому замедлению работы алгоритма.
Это не самый быстрый алгоритм, но он очень прост, а также быстро сортирует небольшие списки.