1. 程式人生 > >手寫堆(heap)

手寫堆(heap)

手寫堆(heap)

有點閒,突然就想手寫一個堆(heap)。手寫一個就可以隨心所欲地切換自己想抽出的資料是最小還是最大了(* ̄▽ ̄)y
二叉堆還有一個特性就是每個節點的父節點可以保證比它大,若是取最小值則為比它小。

直接上程式碼

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAX_N = 1e5+10;
int heap[MAX_N], sz = 0;
void
push(int x) { //用作插入數值 //自己節點的編號 int i = sz++; while(i > 0) { // 父親節點的編號 int p = (i - 1)/2; // 如果已經沒有大小顛倒則退出 if(heap[p] <= x) break; // 把父親節點的數值放下來,而把自己提上去 heap[i] = heap[p]; i = p; } heap[i] = x; } int pop() { //用作提取並刪除最小值
// 最小值 int ret = heap[0]; // 要提到根的數值 int x = heap[--sz]; heap[sz] = 0; //把提上去的數值清零 // 從根開始向下交換 int i = 0; while(i*2 + 1 < sz) { //比較兒子的值 int a = i*2 + 1, b = i*2 + 2; if(b < sz && heap[b] < heap[a]) a = b; //如果沒有大小顛倒則退出
if(heap[a] >= x) break; // 把兒子的數值提上來 heap[i] = heap[a]; i = a; } heap[i] = x; return ret; } int main() { int temp, n; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &temp); push(temp); } printf("%d\n", pop()); for(int i = 0; i < n-1; i++) { printf("%d ", heap[i]); } printf("%d\n", heap[n-1]); return 0; }

相關推薦

heap(STL的heap演算法)

大家都很強, 可與之共勉 。 發現自己一千多行的模板有問題23333 template < class T > class Heap { private : T

(heap)

手寫堆(heap) 有點閒,突然就想手寫一個堆(heap)。手寫一個就可以隨心所欲地切換自己想抽出的資料是最小還是最大了(* ̄▽ ̄)y 二叉堆還有一個特性就是每個節點的父節點可以保證比它大,若是取最小值則為比它小。 直接上程式碼 #inclu

Luogu [P1334] 瑞瑞的木板(

讀取 兩個 oid print ID 手寫 include 只需要 algorithm 其實這個題完全不需要用手寫堆,只需要一遍遍sort就行了…… 但是! 為了練習手寫堆,還是用手寫堆做了。 在做本題之前,如果你沒有什麽思路的話,建議先做

排序 python

import numpy as np class HeapSort(object): # 這是堆中元素的個數 __count = 0 # 這是堆得最大容量 __capacity = 50 arr = [0]*__capacity def __ini

演算法-

  package heap /** * 根節點從1開始 * parent = k/2 * lchild = i * 2 * rchild = i * 2 +1 */ class MaxHeap { var mArr: IntArray var mC

排序知識點小結1-排序及STL實現

首先是造輪子: // maximum heap based on integer type #include <bits/stdc++.h> using namespace std; const int MAX_SIZE = 100000; int heap[MAX_SIZE], r

Dijkstra+優化模板 (簡單易懂)

#include<cstdio> #include<iostream> #define MAXN 2510 #define INF 1000000000 using namesp

卡常神器

跟gxy大神還有yzh大神學了學手寫的堆,應該比stl的優先佇列快很多。 其實就是維護了一個二叉堆,寫進結構體裡,就沒啥了。。。 據說達哥去年NOIP靠這個暴力多騙了分 合併果子。。。。 #

C++的實現(LuoguP3378模板)

關於堆 二叉堆有兩種形式,分別為大根堆和小根堆。 大根堆有兩個性質: 1.根節點點權為所有節點點權中的最大值; 2.任意節點的點權都大於它的子節點. 同樣地,小根堆也具有兩個性質,並且與大根堆相反: 1.根節點點權為所有點權中的最小值; 2.任意節

堆 1.定義 堆(Heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是一個可以被看做一棵完全二叉樹的陣列物件。 2.性質 1.堆中某個節點的值總是不大於或不小於其父節點的值; 2.堆總是一棵完全二叉樹。 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。

line span main color break for add == else #include<bits/stdc++.h> using namespace std; int tot,dui[10000000],n,x,y; inline void

[Codevs 1230]元素查找(哈希表)

iostream max 插入 第一次 ostream ash string.h string 沒有 題目連接:http://codevs.cn/problem/1230/ 說白了就是要我們自己手寫一個哈希表的數據結構來實現加入和查找功能。map也能直接過(我第一次寫就

簡易-五星評分-jQuery純

開始 round size dcl cas blog ren func fin 超級簡單的評分功能,分為四個步驟輕松搞定: 第一步:   引入jquery文件;這裏我用百度CDN的jquery: <script src="http://apps.bdimg.com/

POJ-3984-迷宮問題-BFS(廣搜)-隊列

org ast href || while div 要去 廣搜 trac 題目鏈接:http://poj.org/problem?id=3984 這個本來是個模板題,可是老師要去不能用STL裏的queue,得自己手寫解決。ORZ....看別人的博客學習。新技能get。。

圖片輪播的代碼

ava absolut 利用 one abs asc src num 輪播 之前有人問過我關於圖片輪播的代碼怎麽寫,盡管我是專註於後臺的,但學習一些後臺的僅僅是還是比較有優點的,我有時候總是把簡單的問題復雜化,其原因還是自己對於知識點的掌握不夠堅固,導致不可以在實踐中充

學習筆記TF020:序列標註、小寫字母OCR數據集、雙向RNN

step session 兩個 手寫體 line 調整 seq cal 預測 序列標註(sequence labelling),輸入序列每一幀預測一個類別。OCR(Optical Character Recognition 光學字符識別)。 MIT口語系統研究組Rob Ka

(Heap)和棧(Stack)

數據結構 item ext 調用 .com 結束 baidu 決定 text 堆,隊列優先,先進先出(FIFO—first in first out) 棧,先進後出(FILO—First-In/Last-Out) 棧(操作系統):由操作系統自動分配釋放 ,存放函數的參

Python 基於KNN算法的識別系統

res eight mon -s 利用 filename setsize http 需要 本文主要利用k-近鄰分類器實現手寫識別系統,訓練數據集大約2000個樣本,每個數字大約有200個樣本,每個樣本保存在一個txt文件中,手寫體圖像本身是32X32的二值圖像,如下圖所示:

BP神經網絡(數字識別)

根據 公式 輸入 廣泛 不可變 理想 變化 n) 放大 1實驗環境 實驗環境:CPU [email protected]/* */,內存8G,windows10 64位操作系統 實現語言:python 實驗數據:Mnist數據集 程序使用的數據庫是mni

keras入門實戰:數字識別

如果 turn wid 寬度 initial 作用 err examples 預測 近些年由於理論知識的硬件的快速發展,使得深度學習達到了空前的火熱。深度學習已經在很多方面都成功得到了應用,尤其是在圖像識別和分類領域,機器識別圖像的能力甚至超過了人類。 本文用深度學習Pyt