平時我們要找中位數還得排一下序,但是如果掌握了堆這乙個結構。我們就只需要乙個大頂堆和乙個小頂堆就可以了。大頂堆和小頂堆的性質不贅述,但是乙個比較重要的提一下,就是大頂堆堆頂是整個堆的最大值,小頂堆的頂必然是最小值。並且我們要實現的中位數的演算法,還需要保證小頂堆的最小值大於大頂堆的最大值。1、有了這一性質,我們能幹嘛呢,我們就可以通過這兩個堆來操作,首先是建堆的過程。
對於一組資料,用流的形式做比喻,乙個資料來到,我們看看我們此時的兩個堆都沒有資料,那麼我們隨便放乙個,比如我們放大頂堆。
2、這時候第二個資料來了,我們就開始判斷。如果此時這個資料小於大頂堆的堆頂,那我們就要放到大頂堆裡面去,反之就放在小頂堆裡面,總之保證大頂堆全部小於小頂堆。但這不算完,因為此時大頂堆兩個數了,我們得平衡兩邊,那我們只需要把大頂堆的堆頂放到小頂堆的堆底就行了。這樣就可以不破壞兩堆大小關係的同時完成數目的平衡。
3、這時候兩堆都有乙個數了,後面的數其實也是一樣的,先判斷的大小,該放到**,再看是否平衡,不平衡就弄平衡。原理都是一樣的。這樣一來,兩堆的堆頂恰好就是中間的兩個數了(大家思考一下~)。
整個思路就是這樣,下面上**
#include
using namespace std;
//實際上大頂堆和小頂堆只相差符號,但是為了省事我這裡就直接拷貝了兩份
void
maxheapinsert
(int a,
int index,
int num)
}void
minheapinsert
(int a,
int index,
int num)
}void
maxheapify
(int a,
int n,
int size)
}void
minheapify
(int a,
int n,
int size)
}int
main()
else
}//放在大頂堆的情況
else
else}}
for(i=
0;i) cout<<<
" ";
cout
0;i) cout<<<
" ";
//得到中位數。。。
}
splay入門題 中位數
mid description 維護乙個集合,有2種操作 1.每次可以插入乙個元素。2.找出當前集合中第 n 1 2 大的元素,把它輸出,然後把它從集合中刪除。n 100000 input 第1行乙個數n,表示由n次操作。接下來n行。每行第1個數c表示操作型別。1.c 1,接下來還有乙個數,表示要插...
Vijos 1549題 中位數
給出1 n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。輸入格式 第一行為兩個正整數n和b 第二行為1 n 的排列。輸出格式 輸出乙個整數,即中位數為b的連續子串行個數。樣例輸入1 5 4 1 2 3 4 5樣例輸出1 2樣例輸入...
演算法 動態中位數問題
輸入一組整數a1,a2,an 每輸入乙個整數,輸出到此時為止的中位數。中位數定義 如果數串的大小是偶數 2j,中位數是從小到大排列的第 j 個數 如果數串的大小是奇數 2j 1,中位數是從小到大排列的第 j 1 個數。一組整數,數字和數字之間以空格隔開。一組整數,數字和數字之間以空格隔開。最後乙個數...