Hero-oo

Hero-oo

email

【排序】快速排序

〇、思想#

  • 分治

一、步骤#

  1. 在数组中选择一個基準 base,將原始數組分為【小於 base】- base -【大於 base】
  2. 對【小於 base】、【大於 base】兩個數組分別重複步驟 1、2,直到排序完成

快速排序

二、實現#

void my_qsort(short *arr, int start, int end)
{
    if (start >= end) {
        return;
    }

    int i = start;
    int j = end;
    int base = arr[start];
    
    while (i < j) {
        while (arr[j] >= base && i < j) {
            j--;
        }
        while (arr[i] <= base && i < j) {
            i++;
        }
        if (i < j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    }
    arr[start] = arr[i];
    arr[i] = base;

    my_qsort(arr, start, i - 1);
    my_qsort(arr, j + 1, end);
}

三、性能分析#

最壞情況#

如果每次選擇的元素 base 都是要排序元素的最大 / 最小元素,則數組每次排序後確定一個元素的位置,耗時:$\theta (n)$,然後遞歸對一個 n-1 個元素和一個 0 個元素的數組進行快排。運行時間為:$T (n) = T (n-1)+T (0)+\theta (n)$
得時間複雜度為:$O (n^2)$

最好情況#

每次選擇的元素都是數組中間的元素,則數組每次排序後確定一個元素的位置,耗時:$\theta (n)$,然後遞歸對兩個 n/2 的元素進行快排。運行時間為 $T (n) = 2T (n/2)+\theta (n)$
得時間複雜度為:$O (nlogn)$

平均情況#

快排的平均運行時間接近於最好的情況,也就是 $O (nlogn)$

四、優化#

  1. 快排中基準 base 的選擇會直接影響性能。為此,可以加一個隨機化選取來優化快排
  2. 對於小數組排序,可以使用其他方法排序
  3. 使用迭代而非遞歸

Done!

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://www.vikifish.com/posts/algo/qsort


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。