Сортировка выбором — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Пример)
м (Исправлена ошибка в таблице и доработано выделение цветом.)
 
(не показаны 22 промежуточные версии 3 участников)
Строка 1: Строка 1:
'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).
+
'''Сортировка выбором''' (англ. ''selection sort'') {{---}} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки.
 
 
== Задача сортировки ==
 
'''На входе''' последовательность из <tex>n</tex> чисел.
 
 
 
'''На выходе''' отсортированная последовательность по неубыванию.
 
  
 
== Алгоритм ==
 
== Алгоритм ==
0. Назовем элементы массива списком.
+
На каждом <tex>i</tex>-ом шаге алгоритма находим <tex>i</tex>-ый минимальный элемент и меняем его местами с <tex>i</tex>-ым элементом в массиве. Таким образом будет получен массив, отсортированный по неубыванию.
  
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> обменов. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный и первый из неотсортированных.
  
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.
+
'''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])
  
 
== Пример ==
 
== Пример ==
[[file:Selection_sort.png|thumb|200px|Пример]]
 
  
Пусть дана последовательность из <tex>6</tex> элементов <tex>5, 4, 1, 6, 2, 3</tex>.
+
Пусть дана последовательность из <tex>5</tex> элементов <tex>5, 4, 1, 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 Сортировка выбором в русской википедии]
+
*[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
 
  
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Сортировки]]
 
[[Категория: Сортировки]]
 +
[[Категория: Квадратичные сортировки]]

Текущая версия на 21:41, 6 декабря 2015

Сортировка выбором (англ. selection sort) — простой алгоритм сортировки со сложностью [math]O(n^2)[/math], где [math]n[/math] — количество элементов для сортировки.

Алгоритм[править]

На каждом [math]i[/math]-ом шаге алгоритма находим [math]i[/math]-ый минимальный элемент и меняем его местами с [math]i[/math]-ым элементом в массиве. Таким образом будет получен массив, отсортированный по неубыванию.

Псевдокод[править]

Вариант 1. Будем каждый раз проходить по всем еще не отсортированным элементам, и, как только найдем элемент меньше, чем первый из неотсортированных, поменяем их местами. Таким образом будет нужно [math]O(n^2)[/math] обменов (для каждого [math]i[/math] требуется [math]O(n-i)[/math] обменов).

 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. Второй вариант немного более экономный. Здесь мы будем менять местами элементы только [math]1[/math] раз для каждого [math]i[/math], всего будет нужно [math]O(n)[/math] обменов. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный и первый из неотсортированных.

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])

Пример[править]

Пусть дана последовательность из [math]5[/math] элементов [math]5, 4, 1, 2, 3[/math]. Будем выделять текущий элемент на каждом шаге фиолетовым цветом, а минимальный черным жирным.

Массив Описание шага
Первый проход (текущий массив начинается с первого элемента)
5 4 1 2 3 Находим первый минимальный элемент — 1
1 4 5 2 3 Меняем минимальный и первый элементы местами
Второй проход (текущий массив начинается со следующего элемента)
1 4 5 2 3 Находим следующий минимальный элемент — 2
1 2 5 4 3 Меняем минимальный и второй элементы местами
Третий проход (текущий массив начинается со следующего элемента)
1 2 5 4 3 Находим следующий минимальный элемент — 3
1 2 3 4 5 Меняем минимальный и третий элементы местами
Четвертый проход (текущий массив начинается со следующего элемента)
1 2 3 4 5 Находим следующий минимальный элемент — 4. Меняем его местами с самим собой.
1 2 3 4 5 Массив отсортирован

См. также[править]

Источники информации[править]

  • Википедия — Сортировка выбором
  • Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4