问题 B: 中位数附近2k+1个数
时间限制: 2 Sec 内存限制: 32 MB
提交: 70 解决: 11
提交 状态 算法问答
题目描述
给出一串整型数 a1,a2,…,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及最接近 m 的大于等于 m 的 k 个数。将这 2k+1 个数按升序排序后输出。
中位数定义:如果数串的大小是偶数 2j,中位数是从小到大排列的第 j 个数;如果数串的大小是奇数 2j+1,中位数是从小到大排列的第 j+1 个数。
输入
第一行是 k 的值和数串的长度 n。
第二行是以空格隔开的 n 个整型数,最后一个数后面有空格。
输出
按升序排列的 2k+1 个数,以空格分开,最后一个数后面没有空格。结果可能出现重复的数。
样例输入
2 10
7 2 5 7 2 10 7 7 13 15
样例输出
5 7 7 7 7
提示
使用时间复杂度是O(n)的算法
思路:
采用优化过的快速选择选出中位数,并将数组切分为左、中位数、右,其中左<中位数<右.
将左、右子数组堆化为两个堆(一个最大堆+一个最小堆)
从堆中删除元素以便于输出那最后的k个数(两组)其中注意到从最大堆删除元素的时候需要逆序输出
算法 | 时间复杂度 |
优化过的快速选择 | O(n) |
堆化 | O(n) |
从堆中取出(删除)元素 | O(klogn) |