《演算法導論》第7章 快速排序 四種變形

2021-08-26 17:26:43 字數 1539 閱讀 7087

這一章的正文及思考題部分講到了快速排序及其幾種變形,包括:hoare快排,

普通快排,隨機快排,三數取中快排。

這些快排的區別主要是劃分方法partition演算法的不同:如何選取主元,劃分出的

兩部分範圍是什麼。根據劃分出的範圍不同,各變形的quicksort有微小的差別。

1. hoare快排

hoare劃分是最初的版本,與《演算法導論》中的劃分版本相比,它選取第乙個元素a[p]為主元。

劃分後的兩部分是:a[p..j]和a[j+1..r],主元可能放入某乙個之中。

int hoare_partition(int a, int p, int r)

}void hoare_quick_sort(int a, int p, int r)

}

2. 普通快排

選取最後乙個元素a[r]為主元後,j 從頭遍歷到尾,i 是兩範圍的分隔。

劃分結果為[p, q - 1]和[q + 1, r]。

int partition(int a, int p, int r)

}swap(a, i + 1, r);

return i + 1;

}void quick_sort(int a, int p, int r)

}

3. 隨機快排

通過標頭檔案stdlib.h中的rand()方法生成[p, r]之間的隨機數作為主元。

rand() % n 將生成 [0, n)之間的隨機數。

為了重用partition方法,將選定的主元交換到位置 r。

int randomized_partition(int a, int p, int r)

void randomized_quick_sort(int a, int p, int r)

}

4. 三數取中快排

每次劃分前,從當前子陣列裡隨機取出三個數,取這三個數的中間數作為主元的索引。

int median_partition(int a, int p, int r)

void median_quick_sort(int a, int p, int r)

}//測試方法

int main(void)

; print(a, size);

//hoare_quick_sort(a, 0, size - 1);

//quick_sort(a, 0, size - 1);

//randomized_quick_sort(a, 0, size - 1);

median_quick_sort(a, 0, size - 1);

print(a, size);

return 1;

}

《演算法導論》第7章 快速排序 四種變形

這一章的正文及思考題部分講到了快速排序及其幾種變形,包括 hoare快排,普通快排,隨機快排,三數取中快排。這些快排的區別主要是劃分方法partition演算法的不同 如何選取主元,劃分出的 兩部分範圍是什麼。根據劃分出的範圍不同,各變形的quicksort有微小的差別。1.hoare快排 hoar...

演算法導論 第7章 快速排序

一 快速排序演算法的基本特性 時間複雜度 o n lgn 最壞 o n 2 空間複雜度 o n lgn 不穩定。快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o nlgn 最壞情況是o n 2 通常是用於排序的最佳選擇。因為,排序最快,也只能達到o nlgn 二 快速排序演算法的描述 ...

演算法導論 第7章快速排序

1 演算法描述 快速排序也是基於分治模式的,下面是乙個典型子陣列a p.r 排序的分治過程,主要分為三個步驟 1 分解 將陣列a p.r 劃分成兩個子陣列a p.q 1 和a q 1.r 使得前乙個陣列中每個值都小於等於a q 後乙個陣列每個值都大於a q 下標q也在這個分解過程中求得。2 解決 通...