1 最大值和最小值
对大小为n的数组求最大值或最小值,仅需比较n-1次即可。
MinMum(A,n)
min=A[0];
for(i=1;i<n;i++)
if(A[i]<min)
min=A[i];
对最大值也是如此。
若同时取得最大值和最小值,按照上述方法,需比较2(n-1)次。
事实上,至多3/2n次即可同时求得最大值和最小值。成对成对的比较,对没对数先进行比较,然后另其中较大者与max比较,较小者与min比较,这样每对只需比较3次,共需3/2n次。初始化最大值最小值时还需区分偶数和奇数。
2 求第i小的元素。
类似与快速排序,利用分治法,将输入数组A[p..r]划分成两个字数组A[p..q-1]和A[q+1..r],其中一个子数组中的元素小于A[q],另一个字数组中的元素大于A[q],然后根据第i小的元素落在那个子数组中进行递归调用,伪代码如下:
Randomized_Select(A,p,r,i)
if (p==r)
return A[p];
q=Randomized_Select(A,p,r);
k=q-p+1;
if(i==k)
return A[q];
if(i<k)
return Randomized_Select(A,p,q-1,i);
else
return Randomized_Select(A,q+1,r,i-k);
示例代码如下:
ps:该算法最坏情况下时间复杂度为O(n2),平均情况下O(n)。
算法导论中还提到了最坏情况线性时间的选择。