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

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показано 15 промежуточных версий 4 участников)
Строка 1: Строка 1:
'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки.
+
'''Сортировка выбором''' (англ. ''selection sort'') {{---}} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки.
  
 
== Алгоритм ==
 
== Алгоритм ==
1. Находим номер минимального элемента из текущего массива.
+
На каждом <tex>i</tex>-ом шаге алгоритма находим <tex>i</tex>-ый минимальный элемент и меняем его местами с <tex>i</tex>-ым элементом в массиве. Таким образом будет получен массив, отсортированный по неубыванию.
  
2. Меняем минимальный элемент с первым элементом массива.
+
== Псевдокод ==
 +
'''Вариант 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])
  
3. Если текущий массив пуст, то данный массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из текущего массива.
+
'''Вариант 2.'''
 +
Второй вариант немного более экономный. Здесь мы будем менять местами элементы только <tex>1</tex> раз для каждого <tex>i</tex>, всего будет нужно <tex>O(n)</tex> обменов. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный и первый из неотсортированных.
  
== Реализация ==
+
'''function''' selectionSort('''T[n]''' a):
  // Входной массив x, содержащий n элементов.
+
    '''for''' i = 0 '''to''' n - 2
  for i = 0 to n - 1
+
      min = i
    min = i;
+
      '''for''' j = i + 1 '''to''' n - 1
        for j = i + 1 to n - 1
+
        '''if''' a[j] < a[min]
          if x[j] < x[min]
+
          min = j
              min = j;
+
      swap(a[i], a[min])
    swap(x[i], x[min]);
 
  // Массив x отсортирован
 
  
 
== Пример ==
 
== Пример ==
  
Пусть дана последовательность из <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:#CCC;margin:0.5px"
!style="background-color:#EEE"| До
+
!style="background-color:#EEE"| Массив
!style="background-color:#EEE"| После
 
 
!style="background-color:#EEE"| Описание шага
 
!style="background-color:#EEE"| Описание шага
 
|-
 
|-
|colspan=3|''Первый проход (проталкиваем второй элемент — '''''2''''')''
+
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| '''5 2''' 4 3 1
+
|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"| '''2 5''' 4 3 1
+
|style="background-color:#FFF;padding:2px 10px"| Находим первый минимальный элемент {{---}} '''1'''
|style="background-color:#FFF;padding:2px 10px"| Алгоритм сравнивает второй элемент с первым и меняет их местами.
 
 
|-
 
|-
|colspan=3|''Второй проход (проталкиваем третий элемент — '''''4''''')''
+
|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"| Меняем минимальный и первый элементы местами
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| 2 '''5 4''' 3 1
+
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''
|style="background-color:#FFF;padding:2px 10px"| 2 '''4 5''' 3 1
 
|style="background-color:#FFF;padding:2px 10px"| Сравнивает третий со вторым и меняет местами
 
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| '''2 4''' 5 3 1
+
|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 4''' 5 3 1
+
|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''2'''
|style="background-color:#FFF;padding:2px 10px"| Второй и первый отсортированы, swap не требуется
 
 
|-
 
|-
|colspan=3|''Третий проход (проталкиваем четвертый — '''''3''''')''
+
|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"| Меняем минимальный и второй элементы местами
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| 2 4 '''5 3''' 1
+
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''
|style="background-color:#FFF;padding:2px 10px"| 2 4 '''3 5''' 1
 
|style="background-color:#FFF;padding:2px 10px"| Меняет четвертый и третий местами
 
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| 2 '''4 3''' 5 1
+
|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"| 2 '''3 4''' 5 1
+
|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''3'''
|style="background-color:#FFF;padding:2px 10px"| Меняет третий и второй местами
 
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| '''2 3''' 4 5 1
+
|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"| '''2 3''' 4 5 1
+
|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и третий элементы местами
|style="background-color:#FFF;padding:2px 10px"| Второй и первый отсортированы, swap не требуется
 
 
 
 
|-
 
|-
|colspan=3|''Четвертый проход (проталкиваем пятый элемент — '''''1''''')''
+
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| 2 3 4 '''5 1'''
+
|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"| 2 3 4 '''1 5'''
+
|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''4'''. Меняем его местами с самим собой.
|style="background-color:#FFF;padding:2px 10px"| Меняет пятый и четвертый местами
 
 
|-
 
|-
|style="background-color:#FFF;padding:2px 10px"| 2 3 '''4 1''' 5
+
|style="background-color:#FFF;padding:2px 10px"| 1 2 3 4 5
|style="background-color:#FFF;padding:2px 10px"| 2 3 '''1 4''' 5
+
|style="background-color:#FFF;padding:2px 10px"| Массив отсортирован
|style="background-color:#FFF;padding:2px 10px"| Меняет четвертый и третий местами
 
|-
 
|style="background-color:#FFF;padding:2px 10px"| 2 '''3 1''' 4 5
 
|style="background-color:#FFF;padding:2px 10px"| 2 '''1 3''' 4 5
 
|style="background-color:#FFF;padding:2px 10px"| Меняет третий и второй местами
 
|-
 
|style="background-color:#FFF;padding:2px 10px"| '''2 1''' 3 4 5
 
|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 Сортировка выбором в русской википедии]
+
*[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
 
  
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Сортировки]]
 
[[Категория: Сортировки]]
 +
[[Категория: Квадратичные сортировки]]

Текущая версия на 19:25, 4 сентября 2022

Сортировка выбором (англ. 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