線形時間として望ましい選択アルゴリズム(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 }