<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=85.172.21.146</id>
	<title>wiki12 - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=85.172.21.146"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/85.172.21.146"/>
	<updated>2026-07-17T21:15:16Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%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&amp;diff=40230</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%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&amp;diff=40230"/>
		<updated>2024-12-08T08:00:57Z</updated>

		<summary type="html">&lt;p&gt;85.172.21.146: не верно поставленные переменные приводят к тому, что код не работает&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Алгоритм&lt;br /&gt;
| предназначение = [[Алгоритм сортировки]]|изображение&lt;br /&gt;
| подпись = Действие алгоритма на примере сортировки случайных точек.&lt;br /&gt;
| данные = [[Массив (программирование)|Массив]]&lt;br /&gt;
| время = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| лучшее-время = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| среднее-время = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| память = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Сортировка выбором&#039;&#039;&#039; ([[Английский язык|англ.]] &#039;&#039;selection sort&#039;&#039;) — [[алгоритм сортировки]]. Может быть как устойчивый, так и неустойчивый.&lt;br /&gt;
На массиве из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов имеет время выполнения в худшем, среднем и лучшем случае &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, предполагая что сравнения делаются за постоянное время.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм без дополнительного выделения памяти ==&lt;br /&gt;
[[Файл:Selection-Sort-Animation.gif|thumb|288px|Сортировка выбором]]&lt;br /&gt;
Шаги алгоритма:&lt;br /&gt;
# Находим номер минимального значения в текущем списке.&lt;br /&gt;
# Производим обмен этого значения со значением первой неотсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции).&lt;br /&gt;
# Теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы.&lt;br /&gt;
&lt;br /&gt;
== Реализация алгоритма на языках программирования ==&lt;br /&gt;
Далее находится пример [[Устойчивая сортировка|неустойчивой]] реализации данного алгоритма:&lt;br /&gt;
&lt;br /&gt;
=== [[C++]] ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;typename type_arr&amp;gt;&lt;br /&gt;
void selection_sort(type_arr *arr, int size)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; size - 1; i++)&lt;br /&gt;
    {&lt;br /&gt;
        int min_index = i;&lt;br /&gt;
        for (int j = i + 1; j &amp;lt; size; j++)&lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;lt; arr[min_index])&lt;br /&gt;
            {&lt;br /&gt;
                min_index = j;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (min_index != i)&lt;br /&gt;
        {&lt;br /&gt;
            swap(arr[i], arr[min_index]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[C Sharp|C#]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public static IList&amp;lt;T&amp;gt; Selection&amp;lt;T&amp;gt;(IList&amp;lt;T&amp;gt; list) where T : IComparable&amp;lt;T&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; list.Count - 1; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        int min = i;&lt;br /&gt;
        for (int j = i + 1; j &amp;lt; list.Count; ++j)&lt;br /&gt;
        {&lt;br /&gt;
        	if (list[j].CompareTo(list[min]) &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                min = j;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        var dummy = list[i];&lt;br /&gt;
        list[i] = list[min];&lt;br /&gt;
        list[min] = dummy;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return list;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[PL/SQL]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;plsql&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
type sort_choice_list is table of integer index by binary_integer; &lt;br /&gt;
---------------------------------------------&lt;br /&gt;
function SORT_CHOICE return sort_choice_list&lt;br /&gt;
  IS&lt;br /&gt;
    list sort_choise_list;&lt;br /&gt;
    l_min pls_integer;&lt;br /&gt;
    l_dummy pls_integer;&lt;br /&gt;
  begin &lt;br /&gt;
  &lt;br /&gt;
      for n in 1..100 loop&lt;br /&gt;
        list(n):=dbms_random.random; --инициализация массива случайными числами&lt;br /&gt;
      end loop;&lt;br /&gt;
      &lt;br /&gt;
      for i in list.first..list.last loop&lt;br /&gt;
           l_min:=i;&lt;br /&gt;
           for j in (i + 1)..list.last loop&lt;br /&gt;
                if (list(j) &amp;lt; list(l_min)) then&lt;br /&gt;
                    l_min := j;&lt;br /&gt;
                end if;&lt;br /&gt;
            end loop;&lt;br /&gt;
            l_dummy:=list(i);&lt;br /&gt;
            list(i):=list(l_min);&lt;br /&gt;
            list(l_min) := l_dummy;&lt;br /&gt;
      end loop;&lt;br /&gt;
         &lt;br /&gt;
    return list;&lt;br /&gt;
      &lt;br /&gt;
end SORT_CHOICE;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== [[Java]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	public static void selectionSort(int [] arr) {&lt;br /&gt;
		int n = arr.length;&lt;br /&gt;
		for(int i = 0; i&amp;lt;n-1; i++) {&lt;br /&gt;
			int minIndex = i;&lt;br /&gt;
			for(int j=i+1; j&amp;lt;n; j++) {&lt;br /&gt;
				if(arr[j]&amp;lt;arr[minIndex]) {&lt;br /&gt;
					minIndex = j;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if(minIndex!=i) swap(arr,i,minIndex);&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Ruby]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def selection_sort(array)&lt;br /&gt;
	for min in 0..array.count-2&lt;br /&gt;
		least = min&lt;br /&gt;
		for j in (min + 1)..array.count-1&lt;br /&gt;
			if array[j] &amp;lt; array[least]&lt;br /&gt;
				least = j&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		temp = array[min]&lt;br /&gt;
		array[min] = array[least]&lt;br /&gt;
		array[least] = temp&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== [[Swift (язык программирования)|Swift]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;swift&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
func selectionSort&amp;lt;Element&amp;gt;(_ array: inout Array&amp;lt;Element&amp;gt;) where Element: Comparable {&lt;br /&gt;
	for min in 0..&amp;lt;array.count - 1 {&lt;br /&gt;
		for j in min..&amp;lt;array.count {&lt;br /&gt;
			if array[j] &amp;lt; array[min] {&lt;br /&gt;
				let temp = array[min]&lt;br /&gt;
				array[min] = array[j]&lt;br /&gt;
				array[j] = temp&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== [[PascalABC.NET]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pascal line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
begin&lt;br /&gt;
  var a := ArrRandom;&lt;br /&gt;
  a.Println;&lt;br /&gt;
&lt;br /&gt;
  for var i:=0 to a.High do&lt;br /&gt;
     Swap(a[i],a[i+a[i:].IndexMin]);&lt;br /&gt;
&lt;br /&gt;
  a.Println;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Python]] ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def select_sort(A):&lt;br /&gt;
    for i in range(len(A) - 1):&lt;br /&gt;
        min_index = i&lt;br /&gt;
        for k in range(i + 1, len(A)):&lt;br /&gt;
            if A[k] &amp;lt; A[min_index]:&lt;br /&gt;
                A[k], A[min_index] = A[min_index], A[k]&lt;br /&gt;
    return A&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Go]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
func selectionSort(nums []int) {&lt;br /&gt;
    n := len(nums)&lt;br /&gt;
&lt;br /&gt;
    for i := 0; i &amp;lt; n; i++ {&lt;br /&gt;
        min := i &lt;br /&gt;
        for j := i + 1; j &amp;lt; n; j++ {&lt;br /&gt;
            if nums[j] &amp;lt; nums[min] {&lt;br /&gt;
                min = j&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        nums[i], nums[min] = nums[min], nums[i]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Rust (язык программирования)|Rust]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
fn selection_sort&amp;lt;T: Ord&amp;gt;(array: &amp;amp;mut [T]) {&lt;br /&gt;
    let n = array.len();&lt;br /&gt;
&lt;br /&gt;
    for i in 0..n {&lt;br /&gt;
        let mut min_index = i;&lt;br /&gt;
        for j in i + 1..n {&lt;br /&gt;
            if array[min_index] &amp;gt; array[j] {&lt;br /&gt;
                min_index = j;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if min_index != i {&lt;br /&gt;
            array.swap(i, min_index);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Почему такая реализация неустойчива? ===&lt;br /&gt;
Покажем, почему данная реализация является неустойчивой.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующий массив из элементов, каждый из которых имеет два поля. Сортировка идет по первому полю.&amp;lt;br&amp;gt;&lt;br /&gt;
Массив до сортировки: &amp;lt;code&amp;gt;{ (2, a), (2, b), (1, a) }&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Уже после первой итерации внешнего цикла будем иметь отсортированную последовательность: &amp;lt;code&amp;gt;{ (1, a), (2, b), (2, a) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь заметим, что взаимное расположение элементов &amp;lt;code&amp;gt;(2, a)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;(2, b)&amp;lt;/code&amp;gt; изменилось.&amp;lt;br&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;u&amp;gt;рассматриваемая реализация является неустойчивой&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Сравнение с другими алгоритмами сортировки ==&lt;br /&gt;
Так как после каждого прохода по внутреннему циклу делается только один обмен, то общее число обменов равно &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, что в &amp;lt;math&amp;gt;n/2&amp;lt;/math&amp;gt; раз меньше, чем в [[Сортировка пузырьком|сортировке пузырьком]].&amp;lt;br&amp;gt;&lt;br /&gt;
Число проходов по внутреннему циклу равно &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; даже в случае сортировки частично или полностью отсортированного массива.&lt;br /&gt;
&lt;br /&gt;
* Число сравнений в теле цикла равно &amp;lt;math&amp;gt;(n-1)*n/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число сравнений в заголовках циклов &amp;lt;math&amp;gt;(n-1)*n/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число сравнений перед операцией обмена &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Суммарное число сравнений &amp;lt;math&amp;gt;n^2-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число обменов &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время сортировки 10000 коротких целых чисел на одном и том же [[Программно-аппаратный комплекс|программно-аппаратном комплексе]] сортировкой выбором составило ≈ 40 секунд, а ещё более улучшенной [[Сортировка пузырьком|сортировкой пузырьком]] ≈ 30 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Пирамидальная сортировка]] сильно улучшает базовый алгоритм, используя структуру данных «[[Сортирующее дерево|куча]]» для ускорения нахождения и удаления минимального элемента.&lt;br /&gt;
Существует также двунаправленный вариант сортировки методом выбора, в котором на каждом проходе отыскиваются и устанавливаются на свои места и минимальное, и максимальное значения.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{source|Q21694522|part=Глава 3. Метод грубой силы: Сортировка выбором|pages=143—144}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|часть = &#039;&#039;&#039;Часть III. Глава 6. Элементарные методы сортировки: 6.2 Сортировка выбором&#039;&#039;&#039;&lt;br /&gt;
|заглавие = Алгоритмы на C++&lt;br /&gt;
|оригинал = Algorithms in C++&lt;br /&gt;
|автор = Роберт Седжвик&lt;br /&gt;
|ссылка = &lt;br /&gt;
|isbn = 978-5-8459-1650-1&lt;br /&gt;
|страницы = 246-247&lt;br /&gt;
|год = 2011&lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
}}&lt;br /&gt;
* {{Книга:CLRS}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм сортировки#Список алгоритмов сортировки|Список алгоритмов сортировки]]&lt;br /&gt;
* [[Сортировка пузырьком]]&lt;br /&gt;
* [[Сортировка вставками]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* {{cite web|url=http://algolist.manual.ru/sort/select_sort.php|title=Статья &amp;quot;Сортировка выбором&amp;quot; на сайте algolist.manual.ru|accessdate=2012-09-25}} &lt;br /&gt;
* [https://airtucha.github.io/SortVis/ Динамическая визуализация 7 алгоритмов сортировки с открытым исходным кодом] &lt;br /&gt;
&lt;br /&gt;
{{wikibooks|Примеры реализации сортировки выбором|Примеры реализации сортировки выбором}}&lt;br /&gt;
&lt;br /&gt;
{{Алгоритмы сортировки}}&lt;br /&gt;
[[Категория:Алгоритмы сортировки]]&lt;/div&gt;</summary>
		<author><name>85.172.21.146</name></author>
	</entry>
</feed>