weixin_52060533 2020-12-15 21:12 采纳率: 100%
浏览 181
已采纳

求大神帮忙解决找第k名的问题,感激不尽!

                                                                                            c语言

找第k名 (10分)

整数数组中存储有N个整数,编写函数,找出并返回第k大的数。要求时间复杂度要优于O(NlogN)。题目确保输入的K是合法的(1<=k<=N)。你可以认为k远小于N。

函数接口定义:

6 3
(d[]={13,48,43,96,96,8},N=6,k=3)

其中 d ,N和 k 都是用户传入的参数。 d 是数组的初地址, N 是数组的长度, k 是名次,返回第k大的整数(最大值是第一)。

输入样例:

例如:

6 3
(d[]={13,48,43,96,96,8},N=6,k=3)

输出样例:

例如:

48
  • 写回答

4条回答 默认 最新

  • 天际的海浪 2020-12-16 00:08
    关注
    #include <stdio.h>
    
    int tk(int d[], int n,int k) {
    	int arr[k];
    	int len = 0;
    	int temp;
    	int ci;
    	int pi;
    	for (int i = 0; i < n; i++) {
    		if (len<k || d[i]>=arr[0]) {
    			if (len==k) {
    				len--;
    		 		temp = arr[len];
    		 		pi = 0;
    	 			ci = 1;
    				while (ci < len) {
    					if (ci+1 < len && arr[ci+1] < arr[ci])
    						ci++;
    					if (temp <= arr[ci])
      						break;
    					arr[pi] = arr[ci];
    					pi = ci;
    					ci = pi*2+1;
    				}
    				arr[pi] = temp;
    			}
    			len++;
    	 		ci = len-1;
    	 		pi = (ci-1)/2;
    	 		temp = d[i];
    			while (ci>0 && temp < arr[pi]) {
    				arr[ci] = arr[pi];
    				ci = pi;
    				pi = (ci-1)/2;
    			}
    			arr[ci] = temp;
    		}
    	}
    	return arr[0];
    }
    
    int main() {
        int n=6,k=3;
        int d[] = {13,48,43,96,96,8};
    	printf("%d",tk(d,n,k));
    	return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 手机连接电脑热点显示无ip分配
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大