#include <stdio.h> //第x小的数可以用小根堆,先用较少的个数建立一个小根堆,然后插入新的结点,最终把数列插入完,然后用层次遍历的方法,遍历到第K即可 //但是如果选取的根堆规模不能够满足k,会找不到的,所以最笨的办法就是用n建立根堆 int in_num[1001]; int temp; void HeadAdjust(int A[],int m,int len) { //以元素m为根结点 A[0] = A[m]; //把0位空出来用来交换 for(int i=2*m;i<len;i*=2) { if(i<len&&A[i]>A[i+1]) { i++; } if(A[0]<=A[i]) { break; //已经符合小根堆了 } else { A[m] = A[i]; m=i; //继续往下筛选 } } A[m] = A[0]; } void BuildMinHeap(int A[],int len) { for(int i=len/2;i>0;i--) { HeadAdjust(A,i,len); } } void HeadSort(int A[],int len) { BuildMinHeap(A,len); for(int i=len;i>1;i--) { temp = A[i]; A[i] = A[1]; A[1] = temp; //相当于输出了堆顶元素 HeadAdjust(A,1, i-1); } } int main() { int count,k; while(scanf("%d",&count) != EOF) { for(int i=1;i<=count;i++) { scanf("%d",&in_num[i]); } HeadSort(in_num,count); scanf("%d",&k); //现在要在有序序列里面去重 int dest = count,cur=count-1; while(cur>0) { if(in_num[cur] != in_num[dest]) { in_num[--dest] = in_num[cur--]; } else { cur--; } } printf("%d",in_num[count-k+1]); } return 0; }