TOP K 问题
题目描述:查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
解决方案:
void maxHeap(int s[], int i, int len)
{
int largeIndex = -1;
int left = 2 * i;
int right = 2* i + 1;
if (left <= len && s[left] > s[i])
largeIndex = left;
else
largeIndex = i;
if (right <= len && s[right] > s[largeIndex])
largeIndex = right;
if (i != largeIndex)
{
swap(&s[i], &s[largeIndex]);
maxHeap(s, largeIndex, len);
}
}
void buildHeap(int s[], int len)
{
if (s==NULL)
return;
int index = len / 2;
for (int i = index; i >= 1; i--)
maxHeap(s, i, len);
}
1.利用大根堆 O(k+n*logk)
维护K个元素的大根堆,堆顶为堆内元素的最大数值,把每个输入的整数和堆顶的数值比较,比堆顶的元素小,删除堆顶元素,把小的元素放在堆顶,维护大根堆,把此元素“沉降”到合适位置。
实现过程参见
第三节、快速选择SELECT算法的实现
求数组中给定下标区间内的第K小(大)元素
采用伴随数组的方法巧妙且简单,也很好理解和实现,关键 就是在于题目要求是在给定下标区间中找寻第k小(大)的元素,所以,基本上在排序n*logn完了之后,总能 在O(n)的时间内找到想找的数。源代码如下: