STL栈、队列、堆的算法笔记(5)——【寻找中位数】

寻找中位数

题目:

设计一个数据结构,该数据结构动态维护一组数据,且支持如下操作:
1.添加元素: void addNum(int num),将整型num添加至数据结构中。
2.返回数据的中位数: double findMedian(),返回其维护的数据的中位数。
中位数定义:
1.若数据个数为奇数,中位数是该组数排序后中间的数。[1,2,3] -> 2
2.若数据个数为偶数,中位数是该组数排序后中间的两个数字的平均值。[1,2,3,4] -> 2.5

解题图解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题代码:

// 寻找中位数.cpp 
#include <iostream>
#include<queue>
using namespace std;
class Median
{
public:
	double getMedian() {
		if (big_queue.size()==small_queue.size())
		{
			return (double)(big_queue.top() + small_queue.top()) / 2;
		}
		else if (big_queue.size() > small_queue.size()) {
			return big_queue.top();
		}
		return small_queue.top();
	}
	void addNum(int num) {
		if (big_queue.empty())
		{
			big_queue.push(num);
			return;
		}
		if (big_queue.size() == small_queue.size()) {
			if (big_queue.top()>num)
			{
				big_queue.push(num);
			}
			else {
				small_queue.push(num);
			}
		}
		else if (big_queue.size() > small_queue.size())
		{
			if (big_queue.top()<num)
			{
				small_queue.push(num);
			}
			else {
				small_queue.push(big_queue.top());
				big_queue.pop();
				big_queue.push(num);
			}
		}
		else if (big_queue.size() < small_queue.size()) {
			if (small_queue.top() < num)
			{
				big_queue.push(small_queue.top());
				small_queue.pop();
				small_queue.push(num);
			}
			else {
				big_queue.push(num);
			}
		}
	}
private:
	priority_queue<int> big_queue;
	priority_queue<int, vector<int>, greater<int>> small_queue;
};
int main()
{
	Median median;
	median.addNum(3);
	median.addNum(7);
	median.addNum(12);
	median.addNum(8);
	double m = median.getMedian();
	cout << m << endl;
}

谢谢观看。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11STL中常用算法有以下几个,分别是: 1. make_heap:将一个序列变成一个。 2. push_heap:将一个元素插入到中,并保持的性质。 3. pop_heap:将顶元素移到序列末尾,并保持的性质。 4. sort_heap:将一个排序。 下面对每个算法进行详细介绍: 1. make_heap make_heap函数用于将一个序列变成一个。其函数原型如下: ```c++ template <class RandomAccessIterator> void make_heap(RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。 例如,如果有一个整数数组a,我们想要将其变成一个,可以这样写: ```c++ int a[] = {3, 1, 4, 1, 5, 9}; make_heap(a, a + 6); ``` 这里,a和a+6分别表示数组的起始位置和结束位置。变成后,数组a的内容为:{9, 5, 4, 1, 1, 3}。 2. push_heap push_heap函数用于将一个元素插入到中,并保持的性质。其函数原型如下: ```c++ template <class RandomAccessIterator> void push_heap(RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。插入元素之前,序列必须已经是一个。 例如,如果有一个整数数组a,其中已经有5个元素,我们想要将一个新元素6插入到中,可以这样写: ```c++ int a[] = {9, 5, 4, 1, 1}; push_heap(a, a + 5); a[5] = 6; push_heap(a, a + 6); ``` 这里,a和a+5分别表示数组的起始位置和结束位置,先将前5个元素变成,然后将6插入到数组末尾,再将其插入到中。插入后,数组a的内容为:{9, 6, 4, 1, 1, 5}。 3. pop_heap pop_heap函数用于将顶元素移到序列末尾,并保持的性质。其函数原型如下: ```c++ template <class RandomAccessIterator> void pop_heap(RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。调用该函数之前,序列必须已经是一个。 例如,如果有一个整数数组a,其中已经有6个元素,我们想要将顶元素弹出,可以这样写: ```c++ int a[] = {9, 6, 4, 1, 1, 5}; pop_heap(a, a + 6); ``` 这里,a和a+6分别表示数组的起始位置和结束位置,先将前6个元素变成,然后将顶元素(9)移到数组末尾。弹出后,数组a的内容为:{6, 1, 4, 1, 5, 9}。 4. sort_heap sort_heap函数用于将一个排序。其函数原型如下: ```c++ template <class RandomAccessIterator> void sort_heap(RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。调用该函数之前,序列必须已经是一个。 例如,如果有一个整数数组a,其中已经有6个元素,我们想要将其排序,可以这样写: ```c++ int a[] = {6, 1, 4, 1, 5, 9}; make_heap(a, a + 6); sort_heap(a, a + 6); ``` 这里,a和a+6分别表示数组的起始位置和结束位置,先将数组变成,然后进行排序。排序后,数组a的内容为:{1, 1, 4, 5, 6, 9}。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值