关于中位数和顺序统计量的一些讨论
很多时候我们求最大值最小值,其比较的时间均为O(n)
int min=A[0];
for(int i=1;i<N;i++){
if(A[i]<min)
min=A[i];
}
同时求最大最小值时我们可以通过同时把两个元素比较后
再与最大最小值进行比较
if(N%2==1)
{max=A[0];min=A[0];i=1;}
else
i=0;
for(i;i<N;i=i+2){
int max_a=i,min_a=i+1;
if(a[i]<a[i+1]) {
max_a=a[i+1];
min_a=a[i];
}
if(max_a>max){
max=max_a;
}
if(min_a<min){
min=max_b;
}
}
求一行数中第i大的数值
每次在数列[p```````r]中随机取一个数,通过类似于快速排序中求位置pos的方法。
若随机取得的数位置pos大于i则在[p``````pos]中继续查找
若随机取得的数位置pos小于i则在[pos······r]中继续查找
若随机取得的数位置pos等于i咋直接返回该数
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int Randomized_Position(int A[],int p,int r);
int Randomized_Select(int A[],int p,int r,int i);
int A[100];
int Randomized_Select(int A[],int p,int r,int i){
if(p==r)
return A[p];
int q=Randomized_Position(A,p,r);
int k=q-p+1;
if(i==k)
return A[q];
else if(i<k)
return Randomized_Select(A,p,q-1,i);
else
return Randomized_Select(A,q+1,r,i-k);
}
void exchange(int p,int r){
int temp;
temp=A[p];
A[p]=A[r];
A[r]=temp;
}
int Randomized_Position(int A[],int p,int r){
srand(unsigned(time(0)));
int temp=p+rand()%(r-p+1);
int key=A[temp];
exchange(p,temp);
while(p<r) {
while(p<r&&A[r]>=key) --r;
A[p]=A[r];
while(p<r&&A[p]<=key) ++p;
A[r]=A[p];
}
A[p]=key;
return p;
}
int main(){
while(1)
{
for(int i=0;i<4;i++){
cin>>A[i];
}
cout<<Randomized_Select(A,0,3,2)<<endl;
}
}