阿摩線上測驗 登入

申論題資訊

試卷:108年 - 108 一般警察特種考試_二等_刑事警察人員犯罪分析組:計算機概論(包括計算機結構、資料結構、程式設計)#77046
科目:計算機概論、大意(資訊科學概論,電腦常識,電子計算機概論)
年份:108年
排序:0

申論題內容

四、針對 Quicksort 演算法:⑴請敘述如何用遞迴的方式來製作(10 分) ,並 且⑵說明它的優點和缺點。請涵蓋時間複雜度,以及在什麼情況下會有 很差的效能。 (10 分)

詳解 (共 1 筆)

詳解 提供者:hchungw
⑴ 遞迴實現快速排序(Quicksort):
快速排序是一種高效的排序演算法,由C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer)。以下是快速排序使用遞迴方式的基本步驟:
選擇基準點(Pivot):
從數列中選擇一個元素作為基準點。
分割(Partition):
重新排列數列,所有比基準點小的元素放基準點前面,所有比基準點大的元素放在基準點後面。在這個分割結束之後,對基準點的排序就已經完成。
遞迴排序子序列:
遞迴地將小於基準點的子序列和大於基準點的子序列排序。
快速排序的遞迴過程可以終止於子序列的大小減至1,這意味著該元素已經被排序。
示例代碼(C語言):
c
Copy code
#include <stdio.h>
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 partition(int arr[], int low, int high) {
    int pivot = arr[high];  
    int i = (low - 1); 
    for (int j = low; j <= high - 1; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}
void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}
⑵ 優點和缺點:
優點:
高效:在大多數情況下,快速排序的平均時間複雜度為O(n log n)。
就地排序:不需要額外的存儲空間。
缺點:
最壞情況性能差:如果數據已經是有序的或者幾乎有序的,快速排序的時間複雜度會退化到O(n^2)。這可以通過隨機選擇基準點來優化。
不穩定排序:相等的元素可能會因排序而改變順序。
快速排序在處理大數據集時表現良好,但在數據集較小或幾乎已排序的情況下,其性能可能不如其他排序算法,如插入排序。