快速排序
快速排序
-利用分治策略
-在原地排序
-经过调整后很实用
#include<stdio.h> void quicksort(int* A, int p, int r); int partition(int* A, int p, int r); int main() { int A[10] = {11, 2, 3, 13, 5, 9, 10, 11, 19, 15}; quicksort(A, 0, 10); for(int i = 0; i < 10; i++) printf("%d ", A[i]); return 0; } void quicksort(int* A, int p, int r) { int q; if(p < r){ q = partition(A, p, r); quicksort(A, p, q - 1); quicksort(A, q + 1, r); } } int partition(int* A, int p, int r) { int x = A[r]; int i = p - 1; int temp; for(int j = p; j <= r - 1; j++){ if(A[j] <= x){ i++; temp = A[i]; A[i] = A[j]; A[j] = temp; } } temp = A[i + 1]; A[i + 1] = A[r]; A[r] = temp; return i + 1; }
算法分析
最坏情况
1.数据已经排好序或者逆序
2.每个分划的一边都没有元素
此时递归式为:T(n) = T(0) + T(n-1) + θ(n)
= T(n-1) + Θ(n) = Θ(n2)
最优情况
最好的情况分划为 n/2 : n/2
此时递归式为: T(n) = 2T(n/2) + Θ(n) = Θ(n lgn)
假设划分过程总产生9:1的划分,
此时递归式为 T(n) = T(1/10n) + T(9/10n) + Θ(n)
≤ cnlog10/9n + Θ(n) = Θ(n lgn)
假设最坏情况和最好情况交替
此时递归式为:
L(n) = 2U(n/2) + Θ(n)
U(n) = L(n-1) + Θ(n)
用代换法:L(n) = 2(L(n/2 - 1) + Θ(n/2)) + Θ(n)
= 2L(n/2 - 1) + Θ(n)
= Θ(n lgn)
随机化快速排序
- 其运行时间不依赖于输入序列的顺序
- 无需对输入序列的分布做任何假设
- 没有一种特定的输入会引起最差情况
- 最差的情况由随机数生成器决定
做法是随机的输入或者随机选择主元
算法分析
令T(n) 为运行时间的随机变量