快速排序通常是用於排序的最佳選擇, 這是因為它的平均效能非常好, 期望的執行時間為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 ...