<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блоги: заметки с тегом алгоритми та структури даних</title>
<link>https://blogengine.ru/blogs/tags/algoritmi-ta-strukturi-danih/</link>
<description>Автоматически собираемая лента заметок, написанных в блогах на Эгее</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.0 (v4079e)</generator>

<itunes:subtitle>Автоматически собираемая лента заметок, написанных в блогах на Эгее</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Алгоритмы сортировки</title>
<guid isPermaLink="false">119832</guid>
<link>https://stefaniuk.website/all/sorting-algorithms/</link>
<pubDate>Thu, 01 Aug 2019 01:05:53 +0500</pubDate>
<author>Bohdan Stefaniuk</author>
<comments>https://stefaniuk.website/all/sorting-algorithms/</comments>
<description>
&lt;p&gt;&lt;a href="https://stefaniuk.website/"&gt;Bohdan Stefaniuk&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;Классификация&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;По степени роста сложности&lt;/li&gt;
&lt;li&gt;По использованию дополнительной памяти&lt;/li&gt;
&lt;li&gt;Рекурсивный или нет&lt;/li&gt;
&lt;li&gt;По устойчивости&lt;/li&gt;
&lt;li&gt;По методу сортировки: вставка, слияние, обмен&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Распространенные алгоритмы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Сортировка пузырьком&lt;/li&gt;
&lt;li&gt;Сортировка вставками&lt;/li&gt;
&lt;li&gt;Сортировка выбором&lt;/li&gt;
&lt;li&gt;Сортировка слиянием&lt;/li&gt;
&lt;li&gt;Быстрая сортировка&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ссылка на сайт с гифками, которые демонстрируют работу алгоритмов: &lt;a href="https://www.toptal.com/developers/sorting-algorithms"&gt;https://www.toptal.com/developers/sorting-algorithms&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Сортировка пузырьком&lt;/h2&gt;
&lt;p&gt;Самая стандартная и простая сортировка. Выполняет проходы по массиву и перемещает наибольший элемент в конец массива.&lt;/p&gt;
&lt;div class="e2-text-table"&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td&gt;Лучший вариант&lt;/td&gt;
&lt;td&gt;Средний вариант&lt;/td&gt;
&lt;td&gt;Худший вариант&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Степень сложности&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рост памяти&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;public void Sort(int[] inputArray)
{
	for (int i = 0; i &amp;lt; inputArray.Length; i++) {
		for (int j = 1; j &amp;lt; inputArray.Length; j++) {
			if (inputArray[j-1] &amp;gt; inputArray[j]) {
				Swap(inputArray, j-1, j);
			}
		}
	}
}

public void Swap(int[] inputArray, int indexLeft, int indexRight)
{
	if (indexLeft == indexRight) return;
	var temp = inputArray[indexLeft];
	inputArray[indexLeft] = inputArray[indexRight];
	inputArray[indexRight] = temp;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Сортировка вставками&lt;/b&gt;&lt;br /&gt;
Также достаточно простой алгоритм, на каждом этапе которого выбирается один элемент массива, для которого осуществляется поиск позиции для вставки.&lt;/p&gt;
&lt;div class="e2-text-table"&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td&gt;Лучший вариант&lt;/td&gt;
&lt;td&gt;Средний вариант&lt;/td&gt;
&lt;td&gt;Худший вариант&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Степень сложности&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рост памяти&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;public static void Sort(int[] inputArray)
{
	int currentElementIndex= 1;
	while (currentElementIndex &amp;lt; inputArray.Length)
	{
		if (inputArray[currentElementIndex] &amp;lt; inputArray[currentElementIndex - 1]) {
			var newIndex = FindIndex(inputArray, inputArray[currentElementIndex]);
			Insert(inputArray, newIndex, currentElementIndex);
		}
		currentElementIndex++;
	}
}

public static int FindIndex(int[] inputArray, int element)
{
	for (int i = 0; i &amp;lt; inputArray.Length; i++)
	{
		if (inputArray[i] &amp;gt; element) {
			return i;
		}
	}
	return 0;
}

public static void Insert(int[] inputArray, int indexLeft, int indexRight)
{
	if (indexLeft == indexRight) return;
	var temp = inputArray[indexLeft];
	inputArray[indexLeft] = inputArray[indexRight];
	for (int current = indexRight; current &amp;gt; indexLeft; current--) {
		inputArray[current] = inputArray[current-1];
	}
	inputArray[indexLeft + 1] = temp;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Сортировка выбором&lt;/b&gt;&lt;br /&gt;
На каждом своем шаге отыскивает наименьший элемент в неотсортированной части массива и устанавливает его в соответствующую позицию массива.&lt;/p&gt;
&lt;div class="e2-text-table"&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td&gt;Лучший вариант&lt;/td&gt;
&lt;td&gt;Средний вариант&lt;/td&gt;
&lt;td&gt;Худший вариант&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Степень сложности&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рост памяти&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;public static void Sort(int[] input) {
	for (int i = 0; i &amp;lt; input.Length; i++) {
		var smallestElementIndex = FindIndexOfSmallestElement(input, i);
		Swap(input, smallestElementIndex, i);
	}
}

public static int FindIndexOfSmallestElement(int[] input, int startFrom = 0) {
	var smallestElementValue = input[startFrom];
	var smallestElementIndex = startFrom;
	for (int i = startFrom + 1; i &amp;lt; input.Length; i++)
	{
		if (smallestElementValue &amp;gt; input[i]) {
			smallestElementValue = input[i];
			smallestElementIndex = i;
		}
	}
	return smallestElementIndex;
}

public static void Swap(int[] input, int indexLeft, int indexRight)
{
	if (indexLeft == indexRight) return;
	var temp = input[indexLeft];
	input[indexLeft] = input[indexRight];
	input[indexRight] = temp;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Сортировка слиянием&lt;/b&gt;&lt;br /&gt;
Разбивает массив на подмассивы примерно одинакового размера, рекурсивно разбивает до тех пор, пока размер массива будет равен 1. После этого происходит сортировка частей и их соединение в один.&lt;/p&gt;
&lt;div class="e2-text-table"&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td&gt;Лучший вариант&lt;/td&gt;
&lt;td&gt;Средний вариант&lt;/td&gt;
&lt;td&gt;Худший вариант&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Степень сложности&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рост памяти&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;public static void Sort(int[] input) {
	if (input.Length &amp;lt;= 1) {
		return;
	}
	
	// Поделили массивы
	var leftSize = input.Length / 2;
	var rightSize = input.Length - leftSize;
	var left = new int[leftSize];
	var right = new int[rightSize];
	
	// Скопировали данные из основного массива
	Array.Copy(input, 0, left, 0, leftSize);
	Array.Copy(input, leftSize, right, 0, rightSize);
	
	Sort(left);
	Sort(right);
	
	Merge(input, left, right);
}

public static void Merge(int[] input, int[] left, int[] right) {
	var leftIndex = 0;
	var rightIndex = 0;
	var leftAndRightSize = left.Length + right.Length;
	
	for (int i = 0; i &amp;lt; leftAndRightSize; i++) {
		if (leftIndex &amp;gt;= left.Length) {
			input[i] = right[rightIndex];
			rightIndex++;
		}
		else if (rightIndex &amp;gt;= right.Length) {
			input[i] = left[leftIndex];
			leftIndex++;
		}
		else if (left[leftIndex] &amp;lt; right[rightIndex]) {
			input[i] = left[leftIndex];
			leftIndex++;
		}
		else {
			input[i] = right[rightIndex];
			rightIndex++;
		}
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Быстрая сортировка&lt;/b&gt;&lt;br /&gt;
Один из самых быстрых алгоритмов, о чем говорит название.&lt;/p&gt;
&lt;p&gt;Этапы сортировки:&lt;br /&gt;
• Случайный выбор опорного элемента массива (pivotValue), относительно которого переупорядочиваются элементы массива.&lt;br /&gt;
• Переместить все значения, которые больше опорного, вправо, а все значения, что меньше опорного, влево.&lt;br /&gt;
• Повторить алгоритм для неотсортированной левой и правой части массива, пока каждый элемент не окажется на своей позиции.&lt;/p&gt;
&lt;div class="e2-text-table"&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td&gt;Лучший вариант&lt;/td&gt;
&lt;td&gt;Средний вариант&lt;/td&gt;
&lt;td&gt;Худший вариант&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Степень сложности&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рост памяти&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;public static void Sort(int[] input, int leftIndex, int rightIndex) {
	var i = leftIndex;
	var j = rightIndex;
	var pivot = input[(leftIndex + rightIndex) &amp;gt;&amp;gt; 1];
	
	while (i &amp;lt;= j) {
		while (input[i] &amp;lt; pivot) {
			i++;
		}
		while (input[j] &amp;gt; pivot) {
			j--;
		}
		
		if (i &amp;lt;= j) {
			Swap(input, i, j);
			j--;
			i++;
		}
		
		if (leftIndex &amp;lt; j) {
			Sort(input, leftIndex, j);
		}
		
		if (rightIndex &amp;gt; i) {
			Sort(input, i, rightIndex);
		}
	}
}

public static void Swap(int[] input, int indexLeft, int indexRight)
{
	if (indexLeft == indexRight) return;
	var temp = input[indexLeft];
	input[indexLeft] = input[indexRight];
	input[indexRight] = temp;
}&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>