線形時間として望ましい選択アルゴリズム(c言語)
5076 ワード
#include
#include
#include
int RANDOMIZED_SELECT(int a[],int p,int r,int i);
int RANDOMIZED_PARTITION(int a[],int p,int r);
int PARTITION(int a[],int p,int r);
void swap(int *a,int *b);
int RANDOM(int p,int q);
int main()
{
int a[] = {10,9,8,7,6,5,4,3,2,1};
int i = 3;
printf(" %d :%d
",i,RANDOMIZED_SELECT(a,0,9,i));
return 0;
}
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int RANDOM(int p,int q)
{
int i,number;
srand((unsigned)time(NULL));
number = rand()%(q-p+1)+p;
// rand%101 100 , q-p+1
// p , p
return number;
}
int PARTITION(int a[],int p,int r)//
{
int x = a[r];
int i = p- 1;
for(int j = p;j<=r-1;j++)
{
if(a[j] <= x)
{
i = i + 1;
swap(&a[j],&a[i]);
}
}
swap(&a[i+1],&a[r]);
return i+1;
}
int RANDOMIZED_PARTITION(int a[],int p,int r)//
{
int i = RANDOM(p,r);
swap(&a[r],&a[i]);
return PARTITION(a,p,r);
}
int RANDOMIZED_SELECT(int a[],int p,int r,int i)//
{
if(p == r)
return a[p];
int q = RANDOMIZED_PARTITION(a,p,r);
int k = q - p + 1;// a[q]
if(i == k)// i,
return a[q];
else if(i < k)// i k ,
return RANDOMIZED_SELECT(a,p,q-1,i);
else //
return RANDOMIZED_SELECT(a,q+1,r,i-k);
// a[q] k , i-k
}