#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int MAXN = 10000;

int N;
int a[MAXN];
int K;

int partition(int l,int r)
{
    int key = a[l];
    while ( l < r )
    {
        while ( l < r && a[r] >= key )
            r--;
        a[l] = a[r];
        while ( l < r && a[l] <= key )
            l++;
        a[r] = a[l];
    }
    a[l] = key;
    return l;
}

void qsort(int l,int r)
{
    //quick sort
    if ( l < r )
    {
        int mid = partition(l,r);
        qsort(l,mid - 1);
        qsort(mid + 1,r);
    }
}

int kth(int l,int r,int k)
{
    //返回a[l]与a[r]之间第k小的数
    if ( l < r )
    {
        int mid = partition(l,r);
        if ( mid - l + 1 == k )
            return a[mid];
        else if ( k > mid - l + 1 )
            return kth(mid + 1,r,k - mid + l - 1);
        else
            return kth(l,mid - 1,k);
    }
}

int main()
{
    scanf("%d",&N);

    srand(time(NULL));
    for (int i = 0; i < N; i++)
        a[i] = rand() % 100;

    qsort(0,N - 1);
    for ( i = 0; i < N; i++)
        printf("%d ",a[i]);
    printf("\n");
    
    while ( scanf("%d",&K) == 1 )
    {
        if ( K > N )
            exit(0);
        int ans = kth(0,N - 1,K);
        printf("第%d小 : %d\n",K,ans);
    }

    return 0;
}

 

posted on 2012-10-30 13:44  Sinker  阅读(191)  评论(0编辑  收藏  举报