Metoda Quicksort w C i Java: kompletny przewodnik

Ostatnia aktualizacja: 6 marca 2026
  • Quicksort to wydajny algorytm sortowania oparty na zasadzie dziel i zwyciężaj, którego średnia wydajność wynosi O(n log n), a w najgorszym przypadku O(n^2).
  • Wybierz element osiowy i podziel mniejsze i większe elementy, aby posortować je rekurencyjnie. Wybór elementu osiowego ma wpływ na wydajność.
  • Można go zaimplementować w językach C i Java; istnieją wersje iteracyjne, nie jest stabilny, a powtarzające się elementy mogą obniżać jego wydajność.
Metoda szybkiego sortowania

W świecie programowania algorytmy sortowania odgrywają fundamentalną rolę. Jednym z najwydajniejszych i najpowszechniej stosowanych algorytmów jest Quicksort. Ten algorytm, znany z szybkości i efektywności sortowania elementów, można zaimplementować w wielu językach programowania, w tym w C i Javie. W tym kompleksowym przewodniku szczegółowo omówimy Quicksort w C i Javie, analizując jego działanie, implementację i kluczowe funkcje. Dołącz do nas w tej fascynującej podróży przez algorytm Quicksort i dowiedz się, jak możesz go zastosować we własnych projektach programistycznych.

Czym jest metoda Quicksort?

Quicksort, znany również jako quicksort, to wydajny algorytm sortowania wykorzystujący technikę dziel i zwyciężaj. Został opracowany przez brytyjskiego informatyka Sir Tony'ego Hoare'a w 1959 roku i od tego czasu stał się jednym z najczęściej stosowanych i badanych algorytmów sortowania w programowaniu.

Algorytm Quicksort opiera się na zasadzie wyboru elementu osiowego z listy do posortowania i podziału pozostałych elementów na dwie grupy: te , które są mniejsze lub równe elementowi osiowemu, oraz te, które są od niego większe. Następnie ten sam proces jest rekurencyjnie stosowany do każdej z dwóch wygenerowanych grup, aż do posortowania wszystkich elementów.

Metoda Quicksort w C

Język programowania C jest szeroko stosowany do implementacji algorytmów ze względu na swoją wydajność i niskopoziomową kontrolę nad sprzętem. Poniżej przedstawiamy krok po kroku implementację metody Quicksort w C:

Krok 1: Wybór punktu obrotu

Najpierw należy wybrać element obrotowy z listy. Istnieją różne podejścia do wyboru elementu osiowego, ale najczęściej wybiera się pierwszy element na liście.

Krok 2: Partycjonowanie

Po wybraniu elementu osiowego listę należy podzielić na dwie grupy: elementy mniejsze lub równe elementowi osiowemu oraz elementy większe od elementu osiowego. Aby to osiągnąć, należy za pomocą lewego i prawego wskaźnika przesuwać się w kierunku środka listy, aż znajdą elementy, które należy zamienić.

  Wszystko o algorytmie Shora: funkcja, wpływ i wyzwania

Krok 3: Rekurencja

Po wykonaniu partycjonowania, ten sam proces jest rekurencyjnie stosowany do każdej z dwóch wygenerowanych grup. Oznacza to, że w każdej grupie wybierany jest nowy element osiowy, a partycjonowanie jest wykonywane ponownie, aż do momentu posortowania wszystkich elementów.

Krok 4: Kombinacja

Na koniec grupy zostają połączone w jeden uporządkowany układ. W tym momencie wszystkie elementy mniejsze lub równe osi obrotu znajdą się po jej lewej stronie, natomiast wszystkie elementy większe od niej znajdą się po jej prawej stronie.

Poniżej znajduje się przykład implementacji metody Quicksort w języku C:

#include <stdio.h>

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[low];
    int i = low + 1;
    int j = high;

    while (1) {
        while (arr[i] < pivot && i <= j)
            i++;

        while (arr[j] > pivot)
            j--;

        if (i >= j)
            break;

        swap(&arr[i], &arr[j]);
    }

    swap(&arr[low], &arr[j]);

    return j;
}

void quicksort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quicksort(arr, low, pivot - 1);
        quicksort(arr, pivot + 1, high);
    }
}

int main() {
    int arr[] = {5, 2, 9, 1, 7, 6, 8, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    quicksort(arr, 0, n - 1);

    printf("Arreglo ordenado: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

Ten kod implementuje metodę Quicksort w języku C, wykorzystując technikę rekurencji. Po uruchomieniu programu tablica wejściowa zostanie posortowana, a wynik zostanie wydrukowany.

Metoda Quicksort w Javie

Java to kolejny powszechnie używany język programowania, który również nadaje się do efektywnej implementacji metody Quicksort. Następnie pokażemy krok po kroku implementację metody Quicksort w języku Java:

Krok 1: Wybór punktu obrotu

Podobnie jak w implementacji w języku C, także w Javie musimy wybrać element pivot z listy. Jako punkt odniesienia możemy wybrać pierwszy element, ostatni element, a nawet losowy element.

Krok 2: Partycjonowanie

Po wybraniu punktu obrotu listę należy podzielić na dwie grupy, tak jak w implementacji C. Użyjemy dwóch indeksów, jednego zaczynającego się na początku listy i jednego na końcu, i przesuniemy je w kierunku środka, aż znajdą elementy, które należy zamienić.

  10 najpopularniejszych algorytmów sortowania

Krok 3: Rekurencja

Po wykonaniu partycjonowania, ten sam proces jest rekurencyjnie stosowany do każdej z dwóch wygenerowanych grup. W tym celu należy wywołać metodę Quicksort ponownie dla każdej grupy, aż do momentu posortowania wszystkich elementów.

Krok 4: Kombinacja

Na koniec grupy są łączone w jedną posortowaną tablicę, tak jak ma to miejsce w implementacji w języku C.

Poniżej znajduje się przykład implementacji metody Quicksort w języku Java:

public class Quicksort {
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[low];
        int i = low + 1;
        int j = high;

        while (true) {
            while (i <= j && arr[i] < pivot)
                i++;

            while (arr[j] > pivot)
                j--;

            if (i >= j)
                break;

            swap(arr, i, j);
        }

        swap(arr, low, j);

        return j;
    }

    public static void quicksort(int[] arr, int low, int high) {
        if (low < high) {
            int pivot = partition(arr, low, high);
            quicksort(arr, low, pivot - 1);
            quicksort(arr, pivot + 1, high);
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 9, 1, 7, 6, 8, 3, 4};
        int n = arr.length;

        quicksort(arr, 0, n - 1);

        System.out.print("Arreglo ordenado: ");
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

Podobnie jak w przypadku implementacji w języku C, kod ten implementuje metodę Quicksort w języku Java za pomocą rekurencji. Po uruchomieniu programu tablica wejściowa zostanie posortowana, a wynik zostanie wydrukowany.

Najczęściej zadawane pytania

1. Jaka jest złożoność metody Quicksort? Metoda Quicksort ma średnią złożoność O(n log n) w przypadku przeciętnym i O(n^2) w przypadku najgorszym, gdzie „n” to rozmiar sortowanej tablicy. Jednak ze względu na swoją wydajność i dobrą wydajność w większości przypadków, Quicksort pozostaje szeroko stosowany.

2. Jak wybrać najlepszy element osiowy w metodzie Quicksort? Wybór elementu osiowego może wpłynąć na wydajność algorytmu. Powszechną strategią jest wybranie środkowego elementu tablicy jako elementu osiowego, aby równomierniej rozmieścić elementy. Inną opcją jest wybranie trzech elementów i użycie ich mediany jako elementu osiowego.

3. Kiedy należy używać sortowania szybkiego zamiast innych algorytmów sortowania? Sortowanie szybkie to doskonały wybór, gdy potrzebujesz wydajnego algorytmu sortowania i dysponujesz wystarczającą ilością pamięci. Jeśli jednak pamięć jest ograniczona lub potrzebujesz stabilnego algorytmu (zachowującego względną kolejność identycznych elementów), możesz rozważyć inne algorytmy, takie jak sortowanie przez scalanie.

  Round Robin Planning: Definicja i przykłady

4. Co się stanie, jeśli sortowana tablica zawiera powtarzające się elementy? Metoda Quicksort bez problemu poradzi sobie z tablicami z powtarzającymi się elementami. Jednak w najgorszym przypadku, gdy wszystkie elementy są takie same, partycjonowanie może nie być sprawiedliwe, co może wpłynąć na wydajność algorytmu.

5. Czy można zaimplementować metodę Quicksort iteracyjnie zamiast rekurencyjnie? Tak, można zaimplementować metodę Quicksort iteracyjnie, używając struktury danych zwanej stosem. Wersja rekurencyjna jest częściej używana, ale wersja iteracyjna może być preferowana w pewnych przypadkach, gdy chcemy uniknąć narzutu związanego z rekurencją.

6. Czy metoda Quicksort jest stabilna? Nie, metoda Quicksort nie jest stabilna, co oznacza, że ​​niekoniecznie zachowuje względną kolejność identycznych elementów. Jeśli wymagany jest stabilny algorytm, należy rozważyć inne opcje, takie jak sortowanie przez scalanie.

Wnioski

Podsumowując, Quicksort to wydajny i szeroko stosowany algorytm sortowania w programowaniu. W tym przewodniku szczegółowo omówiliśmy jego działanie i implementację w językach programowania C i Java. Quicksort wykorzystuje technikę „dziel i zwyciężaj”, wybierając element osiowy i dzieląc pozostałe elementy na dwie grupy. Grupy są sortowane rekurencyjnie, aż do uzyskania ostatecznej, posortowanej tablicy.

Ważne jest, aby zwrócić uwagę na funkcje i zagadnienia związane z Quicksort, takie jak wybór osi czasu i obsługa powtarzających się elementów. Ponadto należy ocenić inne opcje algorytmów sortowania na podstawie konkretnych potrzeb projektu.

Mamy nadzieję, że ten kompleksowy przewodnik dotyczący metody Quicksort w językach C i Java pomoże Ci pogłębić wiedzę na jej temat i zainspiruje Cię do stosowania tego wydajnego algorytmu we własnych projektach programistycznych!