中位数和顺序统计学

来源:互联网 发布:网络割接实施方案 编辑:程序博客网 时间:2024/04/29 05:45

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

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

原创粉丝点击