第9章 中位数和顺序统计量
9.1 最小值和最大值
寻找集合中的最小值or最大值,必须要做n-1次比较。
同时寻找最小值和最大值不需要2(n-1)次比较,我们将一对输入元素相互进行比较,然后把较小的与当前最小值比较,较大的与当前最大值比较,这样每2个元素共需3次比较。所以总的比较次数至多是3(n/2)。
9.2 期望为线性时间的选择算法
选择数组A[p..r]种第i小的元素:
int randomized_select(int a[], int low, int high, int i){
if(low == hight)
return a[low];
q = randomized_partition(a, low, high);
k = q - low + 1;
if(i == k)
return a[q];
else{
if(i < k)
return randomized_select(a, low, q-1 ,i);
else
return randomized_select(a, q+1, low ,i-k);
}
}
9.3 最坏情况为线性时间的选择算法
SELECT算法:
1. 将输入数组的n个元素划分为
n/5
组,每组5个元素,且至多只有一组由剩下的n mod 5个元素组成
2. 寻找这
n/5+1
组中每一组的中位数:首先对每组元素进行插入排序,然后 确定每组有序元素的中位数
3. 对第2步中找出的
n/5+1
个中位数,递归调用SELECT以找出其中位数x(若有偶数个中位数,约定x是较小的中位数)
4. 利用修改多的PARTITION 版本,按中位数的中位数x对数组进行划分。让k比划分的低区中的元素数目多1,因此x是第k小的元素,并且有
n−k
个元素在划分的高区
5. 如果
i=k
,则返回x。如果
i<k
,则在低区递归调用SELECT来找出第i小的元素。如果
i>k
,则在高区递归查找第i-k小的元素。