C 和 Java 中的快速排序方法:完整指南

最後更新: 6月2026
  • 快速排序是一種基於分治法的有效排序演算法,平均表現為 O(n log n),最壞情況為 O(n^2)。
  • 選擇一個樞軸元素,然後遞歸地將較小和較大的元素分開進行排序;樞軸元素的選擇會影響性能。
  • 可以用 C 和 Java 實作;存在迭代版本,但它不穩定,重複元素會降低其效率。
快速排序方法

在程式設計領域,排序演算法扮演著至關重要的角色。快速排序是最有效率、應用最廣泛的演算法之一。該演算法以其快速且高效的排序能力而聞名,並可使用多種程式語言實現,包括 C 和 Java。在本指南中,我們將深入探討 C 和 Java 中的快速排序演算法,分析其運作原理、實作方式和關鍵特性。加入我們,開啟這段精彩的快速排序演算法探索之旅,並學習如何將其應用到您自己的程式設計專案中。

什麼是快速排序方法?

快速排序(Quicksort),也稱為快速排序演算法,是一種高效的排序演算法,它採用了分治法。該演算法由英國電腦科學家托尼·霍爾爵士於1959年開發,此後成為程式設計領域應用最廣泛、研究最深入的排序演算法之一。

快速排序演算法的基本原理是:從待排序清單中選擇一個基準元素,並將剩餘元素分成兩組:一組小於或等於基準元素,另一組大於基準元素。然後,遞歸地對這兩組元素分別執行相同的操作,直到所有元素都被排序完成。

C 語言中的快速排序方法

C 語言因其高效性和對硬體的底層控制能力而被廣泛用於演算法實現。下面,我們將逐步介紹 C 語言中快速排序演算法的實作:

步驟 1:選擇樞軸

首先,必須從清單中選擇一個樞軸項。選擇樞軸的方法有很多種,但常見的方法是選擇清單中的第一個項目。

第 2 步:分區

一旦選定了樞軸,就必須將清單分成兩組:小於或等於樞軸的元素和大於樞軸的元素。為了實現這一點,使用左指標和右指標向列表的中心移動,直到找到需要交換的元素。

  FIFO 演算法:歷史回顧及其演變

步驟 3:遞迴

完成分區後,將產生的兩組分別遞歸地套用相同的過程。也就是說,在每個群組中選取一個新的樞軸並再次進行分割,直到所有元素都排序完畢。

步驟 4:組合

最後,各組被組合成一個有序的排列。此時,所有小於或等於樞軸的元素將位於其左側,而所有大於樞軸的元素將位於其右側。

以下是 C 語言中 Quicksort 方法的範例實作:

#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;
}

此程式碼使用遞歸技術在 C 中實作快速排序方法。當您執行程式時,輸入數組將被排序並列印結果。

Java中的快速排序方法

Java 是另一種廣泛使用的程式語言,也適合有效地實作快速排序方法。接下來,我們將逐步展示 Java 中 Quicksort 方法的實作:

步驟 1:選擇樞軸

就像在 C 實作中一樣,在 Java 中我們也需要從清單中選擇一個樞軸元素。我們可以選擇第一個元素、最後一個元素甚至隨機元素作為樞軸。

第 2 步:分區

一旦選定了樞軸,就必須將列表分成兩組,就像在 C 實作中一樣。

  強大的基數排序演算法

步驟 3:遞迴

完成分區後,將產生的兩組分別遞歸地套用相同的過程。這是透過對每個群組再次呼叫 Quicksort 方法直到所有元素都排序完畢來實現的。

步驟 4:組合

最後,將這些組組合成一個排序數組,就像在 C 實作中一樣。

以下是 Java 中 Quicksort 方法的範例實作:

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] + " ");
        }
    }
}

與 C 實作類似,此程式碼使用遞歸在 Java 中實作快速排序方法。當您執行程式時,輸入數組將被排序並列印結果。

Preguntas frecuentes

1. 快速排序演算法的複雜度是多少?快速排序演算法的平均複雜度在一般情況下為 O(n log n),最壞情況下為 O(n²),其中「n」是待排序數組的大小。然而,由於其高效性以及在大多數情況下良好的性能,快速排序演算法仍然被廣泛使用。

2. 如何選擇快速排序演算法中的最佳樞軸元素?樞軸元素的選擇會影響演算法的效能。常見的策略是選擇陣列的中間元素作為樞軸元素,以使元素分佈更均勻。另一種方法是選擇三個元素,並使用它們的中位數作為樞軸元素。

3. 什麼情況下應該使用快速排序而不是其他排序演算法?當您需要高效的排序演算法且記憶體充足時,快速排序是一個絕佳的選擇。但是,如果記憶體有限,或者您需要一個穩定的演算法(能夠保持相同元素的相對順序),則可以考慮其他演算法,例如歸併排序。

  莫斯卡定理與量子計算的到來

4. 如果待排序數組包含重複元素會怎樣?快速排序方法可以處理包含重複元素的陣列。但是,在最壞的情況下,當所有元素都相同時,陣列的劃分可能不公平,這會影響演算法的效能。

5. 快速排序演算法是否可以用迭代的方式實現,而不是遞歸的方式?是的,可以使用稱為堆疊的資料結構來迭代地實作快速排序演算法。遞歸版本較為常用,但在某些情況下,為了避免遞迴帶來的開銷,迭代版本可能更合適。

6. 快速排序演算法穩定嗎?不,快速排序演算法不穩定,這意味著它不一定能保持相同元素之間的相對順序。如果需要穩定的演算法,應該考慮其他選擇,例如歸併排序。

結論

總之,快速排序是一種高效且應用廣泛的程式排序演算法。在本指南中,我們詳細探討了它的工作原理以及如何在 C 和 Java 程式語言中實現它。快速排序採用分治法,選擇一個基準元素,並將剩餘元素分成兩組。透過遞歸,對這兩組元素進行排序,直到得到最終的有序數組。

需要注意快速排序的特性和注意事項,例如樞軸選擇和重複元素的處理。此外,還應根據項目的具體需求評估其他排序演算法選項。

我們希望這篇關於 C 和 Java 中快速排序方法的綜合指南能讓您有紮實的理解,並激勵您在自己的程式設計專案中應用這種高效的演算法!