學習《演算法導論》第七章 快速排序 總結

2021-07-04 22:52:18 字數 1444 閱讀 5260

快速排序通常是用於排序的最佳選擇, 這是因為它的平均效能非常好, 期望的執行時間為o(nlg n),且常數因子很小. 另外, 它還能夠進行就地排序. 它的最壞執行時間為o(n^2).

快速排序和合併排序一樣, 也採用了分治的思想. 分治, 之前學過, 有三個步驟:分解, 解決, 合併. 下面對a[p...r]講述快速排序的思想:

分解:a[p...r]被劃分為兩個子陣列a[p...q-1]和a[q+1...r], 使得a[p...q-1]中的每個元素都小於等於a[q]和[q+1...r]中的每個元素. 其中q如何取值是這個演算法的關鍵.

解決:遞迴解決兩個子陣列.

合併:因為這兩個陣列是就地排序的, 且大小關係已定. 合併不需要操作.

該演算法最主要的地方就是陣列的劃分即q值的選擇.

quicksort(a, p, r)

1if p < r

2then q

3quicksort(a, p, q - 1)

4quicksort(a, q + 1, r)

// 下面的partition是就地排序, 是快速排序演算法的關鍵.

partition(a, p, r)

1 x

2 i

3 for j

ifa[j] <= x

5then i

6 exchange a[i] a[j]

7 exchange a[i + 1] a[r]

8 return i + 1

注意:劃分的過程時間複雜度為:o(n)

partition(a, p, r)過程的作用就是將a[p…r]分為四個區域. a[p…i] 中的各個值都小於等於x. a[i + 1…j + 1]中的各個值都大於x. a[r] = x. 其他為任意值.

// 劃分過程

int partition(int* array, int first, int last)

}// 注意:array + plessvaluepart + 1, array + last都是大於plessvaluepart左邊的值.

// 將這兩個數互換, 因為array[last]是主元, 劃分過程就是按照主元來劃分的, 所以要互換

swap (array + plessvaluepart + 1, array + last);

return plessvaluepart + 1;

}// 快速排序

void quicksort(int* array, int begin, int end)

return;

}

演算法導論第七章快速排序學習總結

快速排序是一種最壞情況下時間複雜度為o n 2 的排序演算法,雖然最壞情況下效能較差,但快速排序通常是實際排序應用中的最好的選擇,因為它的平均效能非常好,其期望時間複雜度為o nlgn 且o nlgn 中隱含的常數因子非常小,且能夠進行原址排序,在虛存環境中也能很好地工作,快速排序是一種不穩定的排序...

演算法導論 第七章《快速排序》

本章介紹了快速排序及其演算法分析,快速排序採用的是分治演算法思想,對包含n個數的輸入陣列,最壞情況下執行時間為 n 2 但是平均效能相當好,期望的執行時間為 nlgn 另外快速排序能夠就地排序 我理解是不需要引入額外的輔助空間,每次劃分能確定乙個元素的具體位置 在虛擬環境中能很好的工作。快速排序演算...

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

快速排序通常是實際應用中最好的選擇,因為它的平均效能非常好,它的期望時間複雜度為o nlng 而且隱含的常數因子非常小。另外,它還是原址排序。quicksort a,p,r if p隨著程式的執行,陣列被劃分為4個 小於主元,大於主元,未劃分,主元,可能有空的 區域。對於partition中的第3 ...