Редактирование: Сортировка выбором

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

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
'''Сортировка выбором''' (англ. ''selection sort'') {{---}} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки.
+
'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).
 +
 
 +
== Задача сортировки ==
 +
'''На входе''' последовательность из <tex>n</tex> чисел.
 +
 
 +
'''На выходе''' отсортированная последовательность по неубыванию.
  
 
== Алгоритм ==
 
== Алгоритм ==
На каждом <tex>i</tex>-ом шаге алгоритма находим <tex>i</tex>-ый минимальный элемент и меняем его местами с <tex>i</tex>-ым элементом в массиве. Таким образом будет получен массив, отсортированный по неубыванию.
+
[[file:Selection_sort.png|thumb|256px|Пример работы алгоритма]]
 +
0. Назовем элементы массива списком.
  
== Псевдокод ==
+
1. Находим номер минимального элемента из текущего списка.
'''Вариант 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.'''
+
2. Меняем минимальный элемент с первым элементом списка.
Второй вариант немного более экономный. Здесь мы будем менять местами элементы только <tex>1</tex> раз для каждого <tex>i</tex>, всего будет нужно <tex>O(n)</tex> обменов. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный и первый из неотсортированных.
 
  
'''function''' selectionSort('''T[n]''' a):
+
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.
    '''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>5</tex> элементов <tex>5, 4, 1, 2, 3</tex>. Будем выделять текущий элемент на каждом шаге фиолетовым цветом, а минимальный черным жирным.
+
'''Пример'''
  
{| style="background-color:#CCC;margin:0.5px"
+
Пусть дана последовательность из <tex>6</tex> элементов <tex>5, 4, 1, 6, 2, 3</tex>.
!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"| Массив отсортирован
 
|}
 
  
== См. также ==
+
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.
* [[Сортировка пузырьком]]
 
* [[Сортировка вставками]]
 
* [[Сортировка кучей]]
 
* [[Сортировка слиянием]]
 
* [[Быстрая сортировка]]
 
* [[Сортировка подсчетом]]
 
* [[Сортировка Шелла]]
 
  
== Источники информации ==  
+
== Реализация ==
*[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 Википедия {{---}} Сортировка выбором]
+
  // Входной массив 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
 
  
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Сортировки]]
 
[[Категория: Сортировки]]
[[Категория: Квадратичные сортировки]]
 

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: