快速排序 Quicksort
快速排序的特点:
- 分治的思想
- 就地排序,不需要额外的内存
- 实用性强
分支的步骤:
- Divide: 把一个数组分成两部分,使得数组的下班部分都比主元要小,上半部分都比主元要大。
- Conquer:递归地对两个子序列进行排序
- Combile:子序列合并
Partition的过程:
Partition(A,p, q) pivot = A[p]; i = p; for(j = p+1; j <= q; j++){ if(A[j]<=pivot){ i++; exchange(A[i], A[j]); } } exchange(A[p], A[i]);
return i;
- 划分运行时间:time=θ(n);
Quicksort的过程:
Quicksort(A, p, q) if p<q r = partition(A, p, q); Quicksort(A, p, r-1); Quicksort(A, r+1, q);
最坏情况下的快速排序:
- 如果输入的序列是已经排好序的或者刚好逆序
- 每次Partition的一边都没有元素
- T(n)=T(n-1) +θ(n) =θ(n2)
- 此时快速排序的时间复杂度也插入排序相同
最好情况下的快速排序(我们不应当期望输入序列是最好的情况):
- 每次划分刚好在数组的中间
- T(n) = 2T(n/2) + θ(n) = θ(nlgn)
随机化快速排序算法:
- 随机化选择主元
- 对输入序列的分布不做任何假设
T(n)是对n个元素进行快速排序所用时间的随机变量
For k=0,1……n-1
xk=1 产生了k:n-k-1的划分
xk=0 otherwise
则E[Xk] = 1/n
随机化快速排序算法时间变量的期望: