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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Реализация)
(Тикет 8.1)
Строка 1: Строка 1:
'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки.
+
'''Сортировка выбором''' (англ. ''selection sort'') {{---}} простой алгоритм сортировки со сложностью <tex>O(n^2)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки.
  
 
== Алгоритм ==
 
== Алгоритм ==
 
На каждом <tex>i</tex>-ом шаге алгоритма находим <tex>i</tex>-ый минимальный элемент и меняем его местами с <tex>i</tex>-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.
 
На каждом <tex>i</tex>-ом шаге алгоритма находим <tex>i</tex>-ый минимальный элемент и меняем его местами с <tex>i</tex>-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.
  
== Реализация ==
+
== Псевдокод ==
Вариант 1.
+
'''Вариант 1.'''
   SelectionSort(a)
+
Будем каждый раз проходить по всем еще не отсортированным элементам, и, как только найдем элемент меньше, чем первый из неотсортированных, поменяем их местами. Таким образом для каждого <tex>i</tex> нужно <tex>O(n-i)</tex> обменов.
     for i = 0 to n - 2
+
   '''function''' SelectionSort(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>. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный и первый из неотсортированных.
 +
 
 +
'''function''' SelectionSort(a)
 +
     '''for''' i = 0 '''to''' n - 2
 
       min = i;
 
       min = i;
       for j = i + 1 to n - 1
+
       '''for''' j = i + 1 '''to''' n - 1
         if a[j] < a[min]
+
         '''if''' a[j] < a[min]
 
           min = j;
 
           min = j;
 
       swap(a[i], a[min]);
 
       swap(a[i], a[min]);
 
Вариант 2.
 
  SelectionSort(a)
 
    for i = 0 to n - 2
 
      for j = i + 1 to n - 1
 
        if a[i] > a[j]
 
          swap(a[i], a[j]);
 
  
 
== Пример ==
 
== Пример ==
Строка 65: Строка 68:
 
|}
 
|}
  
 +
== См. также ==
 +
* [[Сортировка пузырьком]]
 +
* [[Сортировка вставками]]
 +
* [[Сортировка кучей]]
 +
* [[Сортировка слиянием]]
 +
* [[Быстрая сортировка]]
 +
* [[Сортировка подсчетом]]
 +
* [[Сортировка Шелла]]
  
== Ссылки ==  
+
== Источники информации ==  
*[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
 
  
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Дискретная математика и алгоритмы]]
 
[[Категория: Сортировки]]
 
[[Категория: Сортировки]]
 +
[[Категория: Квадратичные сортировки]]

Версия 20:10, 6 декабря 2015

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

Алгоритм

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

Псевдокод

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

 function SelectionSort(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]. Для этого сначала мы будем проходить по всем еще не отсортированным элементам, искать минимальный, и только потом менять местами минимальный и первый из неотсортированных.

function SelectionSort(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 5 4 2 3 Находим следующий минимальный элемент — 2
1 2 4 5 3 Меняем минимальный и второй элементы местами
Третий проход (текущий массив начинается со следующего элемента)
1 2 4 5 3 Находим следующий минимальный элемент — 3
1 2 3 5 4 Меняем минимальный и третий элементы местами
Четвертый проход (текущий массив начинается со следующего элемента)
1 2 3 5 4 Находим следующий минимальный элемент — 4
1 2 3 4 5 Меняем минимальный и четвертый элементы местами
1 2 3 4 5 Массив отсортирован

См. также

Источники информации

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