区间第K大数
发布时间:2020-12-14 02:47:20 所属栏目:大数据 来源:网络整理
导读:问题描述 给定一个序列,每次询问序列中第 l 个数到第 r 个数中第 K 大的数是哪个。 输入格式 第一行包含一个数 n,表示序列长度。 第二行包含 n 个正整数,表示给定的序列。 第三个包含一个正整数 m,表示询问个数。 接下来 m 行,每行三个数 l,r,K,表示询
问题描述 #include<stdio.h> #include<stdlib.h> void Copy(int *a,int *tmp,int l,int n) { int i; for(i=0; i<n; i++) tmp[i] = a[l++]; } void QuickSort(int *tmp,int low,int high) { int value,i,j; if(low < high) { value = tmp[low],i = low,j = high - 1; while(i < j) { while(tmp[j] >= value && i < j) j--; tmp[i] = tmp[j]; while(tmp[i] <= value && i < j) i++; tmp[j] = tmp[i]; } tmp[i] = value; QuickSort(tmp,low,i-1); QuickSort(tmp,i+1,high); } } void Find_k(int *tmp,int n,int k) { while(k--) n--; printf("%dn",tmp[n]); } int main() { int n,m,l,k,*a = NULL,*tmp; scanf("%d",&n); a = (int *)malloc(sizeof(int) * n); for(i=0; i<n; i++) scanf("%d",&a[i]); scanf("%d",&m); while(m--) { scanf("%d%d%d",&l,&r,&k); l--; r--; //l和r代表第几个数,分别-1就成了数组下标 n = r - l + 1; //tmp的长度 tmp = (int *)malloc(sizeof(int) * n); Copy(a,tmp,n); QuickSort(tmp,n); Find_k(tmp,n,k); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |