今天练习的是查找k个最小元素,本来能想到的只是各种排序,再取出前k个。答案给出的用法是使用堆,也就是优先队列,明明前几天刚刚看过,看到实现时还是理解了相当久。。。
总结一下,查找k个最小元素,就采用最大堆,当第k+1个元素比堆中最大值小时,两者交换,并进行下滤排序工作;如果是查找k个最大元素,就采用最小堆。
答案中使用了类,关于C++中类的知识需要再复习一下,很多用法忘记了,比如构造函数之类。
另外,在学习堆时,对书中一段:
不太理解。这个例子中也体会到了,如果在下滤操作中不加这个判断:
void shiftDown(int *ret, int pos, int length) {
int t = ret[pos];
for (int s = 2 * pos + 1; s <= length;s=2*s+1) {
if (ret[s] < ret[s + 1]&&s!=length) {
s++;
}
if (t < ret[s]) {
ret[pos] = ret[s];
pos = s;
}
}
ret[pos] = t;
}
int *array;
int size;
};
答案将出现错误。