这个是相对前一篇文章来说的,这是个迭代版本。递归化为迭代的一个关键点,就是看递归调用时,哪些参数值发生改变,然后针对这个参数设计循环。
#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;
while(1)
{
if(p==r)
{
return a[p];
}
q=RandomizedPartition(a,p,r);
k=q-p+1;
if(k==i)
{
return a[q];
}
else if(k>i)
{
r=q-1;
}
else
{
p=q+1;
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;
}