#每日一题#网易2016实习研发工程师笔试题

本文介绍如何使用快速排序的思想来查找整数数组中的第K大的数。通过递归方式,对比K值与当前分区索引,实现左右分区的递归调用。最终找到第K大的数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      问题描述:有一个整数数组,请你根据快速排序的思路,找出数组中第k大的数。

          给定一个整数数组a,同时给定它的大小n和要找的k(k在1到n之间),请返回第k大的数,保证答案存在。

      测试样例:

          【1,3,5,2,2】,5,3

       返回:2

        根据题目的要求:我们利用快速排序的思路,递归时要对于k与i的值进行对比。

       下面给出具体的代码:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

//寻找第k大的数
int quicksortk(int *a,int left,int right,int k)
{
    int i = left;
    int j = right;
    int x = a[left];
    if(left < right){
        while(i < j){
            for(;j > i && a[j] < x;j--);
            if(j > i){
                a[i++] = a[j];
            }
            for(;i < j && a[i] > x;i++);
            if(i < j){
               a[j--] = a[i];
            }
         
        }
        a[j] = x;
        if(k == j){
            return i;
        }else if(k > j){
            //右递归
            quicksortk(a,j + 1,right,k);
        }else{
            //左递归
            quicksortk(a,left,j - 1,k);
        }
        
    }
}

测试程序:

int main(int argc,char**argv)
{
    int n;
    int *a = NULL;
    int i;
    int k;
    int value;
    while(1){
        printf("请输入数组的长度n:(-1 quit)\n");
        scanf("%d",&n);
        if(n == -1){
            printf("error!!\n");
            exit(1);
        }
        a = (int *)malloc(sizeof(int) * n);
        bzero(a,sizeof(int) * n);
        printf("请输入数组元素:\n");
        for(i = 0;i < n;i++){
           scanf("%d",a + i);
        }
        printf("请输入k的值:\n");
        scanf("%d",&k);
        value = quicksortk(a,0,n - 1,k - 1);
        printf("第%d大的数:%d\n",k,a[value]);
        printf("\n");
        free(a);
    }
    return 0;
}

其执行结果:

    其实这样的笔试题算是比较基础的东西,革命尚未成功,同志仍需努力!!!! 在编程之美那本书上也有过类似的问题,只不过它要求寻找的是最大的k个数,在后面的博客中会对于这个问题进行具体的说明的。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值