0
#include<stdio.h>
#include<conio.h>

#define P(x) printf("%d\n",x);
int A[10];

void printarray()
{    
   for (int i = 0; i < 8; i++)
       printf("%d ", A[i]);

    printf("\n");
}

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int partition(int beg, int end)
{
   int a = beg, pivot = A[beg], b = end;

   while (a < b)
   {
      while (A[a] <=pivot) a++;
      while (A[b] > pivot) b--;
      if (a < b)
      {
          swap(&A[a], &A[b]);
          a++;
          b--;
      }
   }
   A[beg] = A[b];  // restore the pivot to its original location
   A[b] = pivot;
   return b; 
}

int Select(int start, int end, int key)
{
    if (start == end)
        return A[start];

    int p = partition(start, end);
    int k = p - start + 1; // no of elements to the left of the pivot

    if (key <= k)
        return Select(start, k, key);  // left
    else
        return Select(k+1, end, key-k);// right
  }
}

int main()
{  
    // input being read from file
    freopen("inp.txt", "r", stdin);

    for (int i = 0; i < 10; i++)
    {
        scanf("%d", &A[i]);
    }

    P(A[Select(0, 7, 6)]);
    getch();

    return 0;
}

ここでは、クイック ソートのパーティショニング機能を使用して配列をパーティショニングしました。生成されているピボットと検索されている要素に基づいて、パーティションのいずれかの部分に再帰呼び出しを行っています。つまり、k 番目に小さい要素です。

4

0 に答える 0