今日是今日毕
今天需要学习内容
- 手写快速选择算法
- 手写最大堆数据结构
A. 快速选择算法
A.1 对应问题
前k大/小数字,第k大/小数字。
A.2 算法原理及步骤
举例:
输入
对于未知顺序的数组arr{0,2,...,n-1}
输出
第k小数字
- 初始化
l=0
,r=arr.length-1
,index=k-1
- 对
arr[l~r]
数组进行随机划分,返回索引q
,满足arr[l~q-1]<=a[q]<=arr[q+1~r]
- 对返回值
q
进行判断:
若q=index
,执行步骤4
若q>index
,说明第k小数字在l~q-1
中,更新r=q-1
,重复步骤2
若q<index
,说明第k小数字在q+1~r
中,更新l=q+1
,重复步骤2 - 输出
arr[index]
A.3 伪代码
-
quickSelect()
Input
data arrayarr{}
,intleft
,intright
,intindex
Output
dataarr[index]
- get initial: left=arr.begin, right=arr.end(), index=k // only for the first function call
- index_r $\leftarrow$ randomPartition(arr{},left,right)
- if index_r $\leq$ index,then:
right $\leftarrow$ index_r - 1
return quickSelect(arr{},left,right,index)
else if index_r $\leq$ index, then
left $\leftarrow$ index_r + 1
return quickSelect(arr{},left,right,index)
else if index_r $=$ index, then
return arr[index]
randomPartition()
输入
数组arr{}
,左索引left
,右索引right
输出
数值arr[index]
partition()
A.4 复杂度计算
期望复杂度为O(n)
,空间复杂度O(log(n))
A.5 C++代码
B. 最大堆数据结构
B.1 对应问题
前k大/小数字,第k大/小数字。