中位数和顺序统计学

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)。

算法导论中还提到了最坏情况线性时间的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值