第k小的数

第k小的数

Time Limit: 5000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

现有一个包含n个整数(1<=n<=900000)的无序序列(保证序列内元素各不相同),输入一个整数k(1<=k<=n),请用较快的方式找出该序列的第k小数并输出。

Input

多组输入。

首先输入一个数据组数T(1<=T<=100)

接下来是T组数据。

每组数据有两行。

第一行先输入两个整数,n和k。

接下来是一行输入n个由空格分开的互不相同的整数num(1<=num<=90000000)。

Output

对于每组数据,输出该组数据中第k小的数num。

Sample Input

1
6 4
3 2 5 1 4 6

Sample Output

4

Hint

Source

axuhongbo

代码如下: 

#include<stdio.h>

int a[90000001] ;

void q_sort(int left , int right , int k)
{
    int i , j  ;
    int key ;
    i = left ; j = right ;
    key = a[i] ;
    while(i<j)
    {
        while(i<j&&a[j]>=key)
            j-- ;
        a[i] = a[j] ;
        while(i<j&&a[i]<key)
            i++ ;
        a[j] = a[i] ;
    }
    a[i] = key ;
    if(i==k-1){
        printf("%d\n",a[i]) ;
        return  ;
    }
    else if(i>k-1)
    {
        q_sort(left, i-1 , k) ;
    }
    else
    {
        q_sort(i+1,right, k ) ;
    }
}

int main()
{
    int t ;
    long long  n , k ;
    int i ;
    scanf("%d",&t) ;

    while(t--)
    {
        scanf("%lld %lld",&n,&k) ;

        for(i = 0 ; i <n ; i++)
        {
            scanf("%d",&a[i]) ;
        }
        q_sort(0,n-1,k) ;
    }
    return 0 ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值