Изменения

Перейти к: навигация, поиск

Сортировка выбором

3874 байта добавлено, 21:41, 6 декабря 2015
м
Исправлена ошибка в таблице и доработано выделение цветом.
'''Сортировка выбором''' (англ. '''selection sort''') {{--- это }} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{--- }} количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem). == Задача сортировки =='''На входе''' последовательность из <tex>n</tex> чисел.  '''На выходе''' отсортированная последовательность по неубыванию.
== Алгоритм ==
[[file:Selection_sort.png|thumb|150px|Пример работы На каждом <tex>i</tex>-ом шаге алгоритма]]0находим <tex>i</tex>-ый минимальный элемент и меняем его местами с <tex>i</tex>-ым элементом в массиве. Назовем элементы массива спискомТаким образом будет получен массив, отсортированный по неубыванию.
== Псевдокод =='''Вариант 1. Находим номер минимального элемента '''Будем каждый раз проходить по всем еще не отсортированным элементам, и, как только найдем элемент меньше, чем первый из текущего списканеотсортированных, поменяем их местами.Таким образом будет нужно <tex>O(n^2)</tex> обменов (для каждого <tex>i</tex> требуется <tex>O(n-i)</tex> обменов). '''function''' selectionSort('''T[n]''' a): '''for''' i = 0 '''to''' n - 2 '''for''' j = i + 1 '''to''' n - 1 '''if''' a[i] > a[j] swap(a[i], a[j])
'''Вариант 2. Меняем '''Второй вариант немного более экономный. Здесь мы будем менять местами элементы только <tex>1</tex> раз для каждого <tex>i</tex>, всего будет нужно <tex>O(n)</tex> обменов. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный элемент с первым элементом спискаи первый из неотсортированных.
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу '''function''' selectionSort('''T[n]''' a): '''for''' i = 0 '''to''' n - 2 min = i '''for''' j = i + 1 '''to''' n - 1 '''if''' a[j] < a[min] min = j swap(a[i], убрав первый элемент из списка.a[min])
=== Пример ===
Пусть дана последовательность из <tex>65</tex> элементов <tex>5, 4, 1, 6, 2, 3</tex>. Будем выделять текущий элемент на каждом шаге фиолетовым цветом, а минимальный черным жирным.
Белым фоном обозначен {| style="background-color:#CCC;margin:0.5px"!style="background-color:#EEE"| Массив!style="background-color:#EEE"| Описание шага|-|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''|-|style="background-color:#FFF;padding:2px 10px"| <span style="color:darkviolet">'''5'''</span> 4 <span style="color:black">'''1'''</span> 2 3|style="background-color:#FFF;padding:2px 10px"| Находим первый минимальный элемент {{---}} '''1''' |-|style="background-color:#FFF;padding:2px 10px"| <span style="color:black">'''1'''</span> 4 <span style="color:darkviolet">'''5'''</span> 2 3|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и первый элементы местами|-|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''|-|style="background-color:#FFF;padding:2px 10px"| 1 <span style="color:darkviolet">'''4'''</span> 5 <span style="color:black">'''2'''</span> 3|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''2''' |-|style="background-color:#FFF;padding:2px 10px"| 1 <span style="color:black">'''2'''</span> 5 <span style="color:darkviolet">'''4'''</span> 3|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и второй элементы местами|-|colspan=3|''Третий проход (текущий список, зеленым отсортированная часть, а красным массив начинается со следующего элемента)''|-|style="background-color:#FFF;padding:2px 10px"| 1 2 <span style="color:darkviolet">'''5'''</span> 4 <span style="color:black">'''3'''</span>|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент{{---}} '''3''' |-|style="background-color:#FFF;padding:2px 10px"| 1 2 <span style="color:black">'''3'''</span> 4 <span style="color:darkviolet">'''5'''</span>|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и третий элементы местами|-|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''|-|style="background-color:#FFF;padding:2px 10px"| 1 2 3 <span style="color:black">'''4'''</span> <span style="color:black">5</span>|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''4'''. Меняем его местами с самим собой.|-|style="background-color:#FFF;padding:2px 10px"| 1 2 3 4 5|style="background-color:#FFF;padding:2px 10px"| Массив отсортирован|}
== Реализация == // Входной массив x, содержащий n элементовСм. for (i также = 0 to n - 1) int min = i; for (j = i + 1 to n - 1)* [[Сортировка пузырьком]] if (x* [[jСортировка вставками] < x]* [min[Сортировка кучей]]) min = j;* [[Сортировка слиянием]] swap(x* [i[Быстрая сортировка]], x* [[minСортировка подсчетом]]); // Массив x отсортирован* [[Сортировка Шелла]]
== Ссылки Источники информации == *[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Википедия {{---}} Сортировка выбором в русской википедии]*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4
== Литература ==
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Сортировки]]
[[Категория: Квадратичные сортировки]]
65
правок

Навигация