Швидке сортування (quick sort), чи сортування Гоара – один з найшвидших алгоритмів сортування даних.
Алгоритм Гоара – це модифікований варіант методу прямого обміну. Інші варіанти цього методу - сортування бульбашкою та шейкерне сортування, на відміну від швидкого сортування, не дуже ефективні.
Принцип роботи алгоритму швидкого сортування
Ідея в основі алгоритму наступна:
- Необхідно вибрати опорний елемент масиву, ним може бути довільний елемент, від цього не залежить правильність роботи алгоритму;
- Розділити масив на три частини, в першу повинні входити елементи менші за опорний, в другу - рівні і в третю - всі елементи більші опорного;
- Рекурсивно виконуються всі попередні кроки, для підмасивів з меншими та більшими значеннями, поки в них знаходиться більше одного елементу.
Оскільки метод швидкого сортування ділить масив на частини, він відносить до групи алгоритмів розділяй та володарюй.
Реалізація швидкого сортування
using System;
class Program
{
//метод для обміну елементів масиву
static void Swap(ref int x, ref int y)
{
var t = x;
x = y;
y = t;
}
//метод повертає індекс опорного елементу
static int Partition(int[] array, int minIndex, int maxIndex)
{
var pivot = minIndex - 1;
for (var i = minIndex; i < maxIndex; i++)
{
if (array[i] < array[maxIndex])
{
pivot++;
Swap(ref array[pivot], ref array[i]);
}
}
pivot++;
Swap(ref array[pivot], ref array[maxIndex]);
return pivot;
}
//швидке сортування
static int[] QuickSort(int[] array, int minIndex, int maxIndex)
{
if (minIndex >= maxIndex)
{
return array;
}
var pivotIndex = Partition(array, minIndex, maxIndex);
QuickSort(array, minIndex, pivotIndex - 1);
QuickSort(array, pivotIndex + 1, maxIndex);
return array;
}
static int[] QuickSort(int[] array)
{
return QuickSort(array, 0, array.Length - 1);
}
static void Main(string[] args)
{
Console.Write("N = ");
var len = Convert.ToInt32(Console.ReadLine());
var a = new int[len];
for (var i = 0; i < a.Length; ++i)
{
Console.Write("a[{0}] = ", i);
a[i] = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("Впорядкований масив: {0}", string.Join(", ", QuickSort(a)));
Console.ReadLine();
}
}
Метод Partition повертає індекс опорного елементу, який розділяє масив на менші за опорний - зліва та елементи більші за опорний - справа. В самому методі в якості опорного вибирається останній елемент, а обхід здійснюється від початку масиву.
Результат роботи програми: