[C#|.NET] Sortowanie szybkie (quicksort)

Sortowanie szybkie (quicksort) to jeden z najbardziej popularnych algorytm贸w sortowania stosowanych w informatyce. Jest on oparty na strategii "dziel i zwyci臋偶aj", kt贸ra polega na podziale problemu na mniejsze cz臋艣ci, rozwi膮zaniu ich osobno, a nast臋pnie po艂膮czeniu otrzymanych wynik贸w.

Algorytm sortowania szybkiego dzia艂a na zasadzie wybierania elementu osiowego (pivot) z tablicy i por贸wnywania pozosta艂ych element贸w z pivotem. Elementy mniejsze od pivota s膮 umieszczane po lewej stronie, a wi臋ksze po prawej stronie. Nast臋pnie sortowanie szybkie jest rekurencyjnie stosowane do obu podtablic - lewej i prawej.

Kluczowym elementem sortowania szybkiego jest wyb贸r odpowiedniego pivota. W przypadku z艂ego wyboru pivota (np. gdy jest on najwi臋kszym lub najmniejszym elementem) mo偶e nast膮pi膰 degeneracja algorytmu i jego wydajno艣膰 mo偶e znacznie si臋 pogorszy膰. Dlatego istnieje wiele strategii wyboru pivota, takich jak wyb贸r losowego elementu, mediany z trzech element贸w lub mediany z pi臋ciu element贸w.

Sortowanie szybkie ma wiele zalet. Jest to algorytm o z艂o偶ono艣ci czasowej O(n log n), co oznacza, 偶e jest bardzo wydajny dla du偶ych zbior贸w danych. Ponadto, sortowanie szybkie jest in-place, co oznacza, 偶e nie wymaga dodatkowej pami臋ci do przechowywania tymczasowych danych. Jest to istotne w przypadku sortowania du偶ych zbior贸w danych, gdzie zarz膮dzanie pami臋ci膮 mo偶e by膰 trudne.

Jednak sortowanie szybkie ma r贸wnie偶 pewne wady. Jedn膮 z nich jest to, 偶e jest on wra偶liwy na dane wej艣ciowe, zw艂aszcza na dane posortowane w odwrotnej kolejno艣ci. W takim przypadku sortowanie szybkie mo偶e mie膰 z艂o偶ono艣膰 czasow膮 O(n^2), co jest mniej efektywne ni偶 inne algorytmy sortowania. Jednak wiele implementacji sortowania szybkiego stosuje r贸偶ne optymalizacje, takie jak losowe wybieranie pivota lub sortowanie przez scalanie dla ma艂ych podtablic, aby unikn膮膰 tej sytuacji.

Mimo tych wad, sortowanie szybkie jest szeroko stosowane w praktyce ze wzgl臋du na swoj膮 wydajno艣膰 i prostot臋 implementacji. Jest cz臋sto u偶ywane w bibliotekach programistycznych i frameworkach do sortowania danych.

Przyk艂ad

Poni偶szy program sortuje tablic臋 liczb ca艂kowitych za pomoc膮 algorytmu sortowania szybkiego. Algorytm jest implementowany rekurencyjnie poprzez podzia艂 tablicy na podtablice i por贸wnywanie element贸w z wybranym elementem osiowym (pivotem). Tablica jest sortowana w miejscu, bez tworzenia nowych tablic.

using System;

class Program {

    static void Main() {
    
        int[] numbers = { 5, 8, 2, 1, 6, 3, 9, 4, 7 };
        
        Console.WriteLine("Przed sortowaniem:");
        
        PrintArray(numbers);

        QuickSort(numbers, 0, numbers.Length - 1);

        Console.WriteLine("Po sortowaniu:");
        
        PrintArray(numbers);
        
    }

    static void QuickSort(int[] array, int low, int high) {
    
        if (low < high) {
        
            int pivotIndex = Partition(array, low, high);
            
            QuickSort(array, low, pivotIndex - 1);
            QuickSort(array, pivotIndex + 1, high);
            
        }
        
    }

    static int Partition(int[] array, int low, int high) {
    
        int pivot = array[high];
        int i = low - 1;

        for (int j = low; j < high; j++) {
        
            if (array[j] < pivot) {
            
                i++;
                
                Swap(array, i, j);
                
            }
            
        }

        Swap(array, i + 1, high);

        return i + 1;
        
    }

    static void Swap(int[] array, int i, int j) {
    
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
        
    }

    static void PrintArray(int[] array) {
    
        foreach (int number in array) {
        
            Console.Write(number + " ");
            
        }
        
        Console.WriteLine();
        
    }
    
}

Komentarze

Popular

[C++] Jak obliczy膰 pole i obw贸d trapezu?

[HTML] Jak wy艣rodkowa膰 tekst?

[PHP|HTML] Od艣wie偶enie strony