堆排序
//heapSort 构建大顶堆或者小顶堆,将堆顶元素与堆尾元素交换后再调整,如此反复 |
- 一个对象的下标为i,他的左右子节点分别是
2i+1和2i+2 - 更换节点的时候
快排
//quickSort 每次选择一个元素并且将整个数组以这个元素分为两部分,小于该元素的放右边,大于该元素的放左边 |
- 主要的思路是每次选择一个(实际上一般是最右边的那一个)元素作为标准,将比这个元素小的元素移动到数组的左边,大的移动到右边,最后实现这个元素的左边的所有元素都比这个元素小,右边的都比这个大。然后再分别对左边和右边的数组分别排序,实现递归。
Leetcode 295. 数据流的中位数
- 用一个最小堆记录大于中位数的数字,和一个最大堆记录小于中位数的数字
- 新加入的数字与小于中位数的数字中的最大值比较,决定插入哪个堆
- 根据总数替换中位数的值
class MedianFinder {
public:
priority_queue<int, vector<int>, less<int>> queMin;
priority_queue<int, vector<int>, greater<int>> queMax;
MedianFinder() {}
void addNum(int num) {
if (queMin.empty() || num <= queMin.top()) {
queMin.push(num);
if (queMax.size() + 1 < queMin.size()) {
queMax.push(queMin.top());
queMin.pop();
}
} else {
queMax.push(num);
if (queMax.size() > queMin.size()) {
queMin.push(queMax.top());
queMax.pop();
}
}
}
double findMedian() {
if (queMin.size() > queMax.size()) {
return queMin.top();
}
return (queMin.top() + queMax.top()) / 2.0;
}
};