类似于快速排序的随机化版本,但是这里每次只处理划分的一侧。最坏情况下时间复杂度为O(n^2),即每次都是按最大区间进行划分。但在平均情况下,任何顺序统计量(特别是中位数)都可以在线性时间内得到,时间复杂度为O(n)。
#include <string.h>
#include <time.h>
#define BUFFER_SIZE 10
int RandomizedPartition(int *a,int p,int r)
{
int i=0;
int j=0;
int tmp=0;
int x=0;
srand((unsigned)time(NULL));
i=rand()%(r-p+1)+p;
tmp=a[i];
a[i]=a[r];
a[r]=tmp;
x=a[r];
i=p-1;
for(j=p;j<r;j++)
{
if(a[j]<=x)
{
i++;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
i++;
tmp=a[i];
a[i]=a[r];
a[r]=tmp;
return i;
}
int RandomizedSelect(int *a,int p,int r,int i)
{
int q=0;
int k=0;
if(p==r)
{
return a[p];
}
q=RandomizedPartition(a,p,r);
k=q-p+1;
if(k==i)
{
return a[q];
}
else if(i<k)
{
return RandomizedSelect(a,p,q-1,i);
}
else
{
return RandomizedSelect(a,q+1,r,i-k);
}
}
int main()
{
int i=0;
int j=0;
int a[BUFFER_SIZE];
printf("随机生成的数组:\n");
srand((unsigned)time(NULL));
for(i=0;i<BUFFER_SIZE;i++)
{
a[i]=rand()%100;//归一化
printf("%d ",a[i]);
}
printf("\n");
i=BUFFER_SIZE/2;
j=RandomizedSelect(a,0,BUFFER_SIZE-1,i);
printf("第i=%d小的元素是:%d\n",i,j);
system("pause");
return 0;
}