第三周要点:
1. quick sort(快速排序O(Nlog(N))
input: a array,unsorted
output: Same numbers sorted in increasing order
algorithm:
pseudocode for partition
the importance of choosing pivot:
worst
例子: 一个y已经排好序的数组 每次只减少了一个元素
best: :
例子: 每次的pivot元素都选到了中间。
而quick_sort 基本上可以达到 的复杂度
2. 证明:
can’t apply master method
decomposition method
general decomposition principle
更详细证明见课程:https://www.coursera.org/learn/algorithms-divide-conquer/exam/h06aN/problem-set-3
3. 习题解释
每个数组都有n个元素,要使小的那个数组的长度比
大,那么快速排序中所要选择的那个pivot 元素x一定要满足
所以这样的概率对于长度为n的数组来说就是
由题已知
, 假设迭代次数为
, 在经过x次迭代后,长度最小的那个向量应该为
,最大的应该为
, 令这两个边界等于1,即可得到答案。
期望的可加性:
将
定义为第i个人和第j个人同一天生日的期望 有
所以k = 28
期望不是概率
期望是事件的平均数!
分别计算一下两边的概率即可得出结论
公式:
在X 和 Y 是独立事件的情况下:
4. quick_sort 代码
#全局变量m用来记录比较次数
m = 0
def partition(A,P):
i = 1
#挪到首位
A[0],A[P] = A[P],A[0]
for j in range(1,len(A)):
if(A[j]<=A[0]):
A[j],A[i] = A[i],A[j]
i += 1
return i
def quick_sort(A):
global m
if(len(A)==1 or len(A)==0):
return A
else:
#三個元素比較
mid = (len(A)-1)//2
P = A.index(sorted([A[0],A[mid],A[len(A)-1]])[1])
i = partition(A,P)
A[0],A[i-1] = A[i-1], A[0]
m += len(A) - 1
A[:i-1] = quick_sort(A[:i-1])
A[i:] = quick_sort(A[i:])
return A