Приветствую всех, сегодня хочу поговорить о алгоритме сортировки. Сегодня в программировании применяются множество готовых решений метод в этой задачи. Но рассмотреть я хотел бы сами алгоритмы сортировки.
Сортировка пузырьковым методом:
private static void BubbleSort(int[] array)
{
for (int i = 0; i < array.Length; i++)
for (int j = 0; j < array.Length - 1; j++)
if (array[j] > array[j + 1])
{
int t = array[j + 1];
array[j + 1] = array[j];
array[j] = t;
}
}
public static void Main()
{
int[] array = {5,3,4,9,7,2,1,8,6 };
BubbleSort(array);
foreach (int e in array)
Console.WriteLine(e);
Console.ReadKey();
}
Решил не углубляться в разбор метода, а показать наглядно что происходит внутри метода сортировки. Для этого посмотрим анимацию:

Сортировка слиянием:
static int[] temporaryArray;
static void Merge(int[] array, int start, int middle, int end)
{
var leftPtr = start;
var rightPtr = middle + 1;
var length = end - start + 1;
for (int i = 0; i < length; i++)
{
if (rightPtr > end || (leftPtr <= middle && array[leftPtr] < array[rightPtr]))
{
temporaryArray[i] = array[leftPtr];
leftPtr++;
}
else
{
temporaryArray[i] = array[rightPtr];
rightPtr++;
}
}
for (int i = 0; i < length; i++)
array[i + start] = temporaryArray[i];
}
static void MergeSort(int[] array, int start, int end)
{
if (start == end) return;
var middle = (start + end) / 2;
MergeSort(array, start, middle);
MergeSort(array, middle + 1, end);
Merge(array, start, middle, end);
}
static void MergeSort(int[] array)
{
temporaryArray = new int[array.Length];
MergeSort(array, 0, array.Length - 1);
}
public static void Main()
{
int [] array = {3,2,5,7,8,1,9 };
MergeSort(array);
foreach (var e in array)
Console.WriteLine(e);
Console.ReadKey();
}
Принцип работы сортировки слияние так же можете увидеть на анимации ниже:

Сортировка Quick-Sort и сортировка Hoare-Sort:
static void HoareSort(int[] array, int start, int end)
{
if (end == start) return;
var pivot = array[end];
var storeIndex = start;
for (int i = start; i <= end - 1; i++)
if (array[i] <= pivot)
{
var t = array[i];
array[i] = array[storeIndex];
array[storeIndex] = t;
storeIndex++;
}
var n = array[storeIndex];
array[storeIndex] = array[end];
array[end] = n;
if (storeIndex > start) HoareSort(array, start, storeIndex - 1);
if (storeIndex < end) HoareSort(array, storeIndex + 1, end);
}
static void HoareSort(int[] array)
{
HoareSort(array, 0, array.Length - 1);
}
static Random random = new Random();
public static void Main()
{
int [] array = {3,2,5,7,8,1,9 };
HoareSort(array);
foreach (var e in array)
Console.WriteLine(e);
Console.ReadKey();
}
Еще один пример быстрой сортировки:
class Program
{
static void Main(string[] args)
{
int[] i = {4,3,7,23,6,8,123,6,32 };
QuickSort(i,0,8);
foreach(int w in i)
{
Console.WriteLine(w);
}
Console.ReadKey();
}
private static int[] QuickSort(int[] a, int i, int j)
{
if (i < j)
{
int q = Partition(a, i, j);
a = QuickSort(a, i, q);
a = QuickSort(a, q + 1, j);
}
return a;
}
private static int Partition(int[] a, int p, int r)
{
int x = a[p];
int i = p - 1;
int j = r + 1;
while (true)
{
do
{
j--;
}
while (a[j] > x);
do
{
i++;
}
while (a[i] < x);
if (i < j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
else
{
return j;
}
}
}
}
Принцип работы сортировки Quick-Sort и сортировка Hoare-Sort так же можете увидеть на анимации ниже:

Существуют:
- алгоритмы сортировки O(n2) вроде сортировки вставками, пузырьком и выбором, которые используются в особых случаях;
- быстрая сортировка (общего назначения): в среднем O(n log n) обменов, но худшее время – O(n2), если массив уже отсортирован, или элементы равны;
- алгоритмы O(n log n), такие как сортировка слиянием и кучей (пирамидальная сортировка), которые также являются хорошими алгоритмами сортировки общего назначения;
- O(n) или линейные алгоритмы сортировки (выбор, выбор с обменом, выбор с подсчетом) для списков целых чисел, которые могут быть подходящими в зависимости от характера целых чисел в ваших списках.
Алгоритм сортировка подсчетом O(n ) C#
private static void CountingSort(int[] arr)
{
int max = arr.Max();
int min = arr.Min();
int[] count = new int[max - min + 1];
int z = 0;
for (int i = 0; i < count.Length; i++)
{
count[i] = 0;
}
for (int i = 0; i < arr.Length; i++)
{
count[arr[i] - min]++;
}
for (int i = min; i <= max; i++)
{
while (count[i - min]-- > 0)
{
arr[z] = i;
z++;
}
}
foreach (var x in arr)
{
Console.Write(x + " ");
}
}
Алгоритм сортировки методом отбора О(n)
public static void Sort(int [] a)
{
int tmp, min_key;
for (int j = 0; j < a.Length - 1; j++)
{
min_key = j;
for (int k = j + 1; k < a.Length; k++)
{
if (a[k] < a[min_key])
{
min_key = k;
}
}
tmp = a[min_key];
a[min_key] = a[j];
a[j] = tmp;
}
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i] + " ");
}
}
Это конечно не все алгоритмы сортировки описаны мною, их куда больше, однако основные алгоритмы я вам показал. И в конце статьи хочу показать вам последнюю анимацию, которая визуально продемонстрирует принцип всех сортировок, а так же время работы методов по отношению друг к другу.

