堆作爲重要的數據結構之一,分爲最大堆和最小堆是二叉堆 的兩種形式。
下面是引自wikipedia的最小堆示例圖:
程序實現:
public class SmallHeap { final static int MAX_LEN = 100; private int queue[] = new int[MAX_LEN]; private int size; public void add(int e){ if(size >= MAX_LEN) { System.err.println("over flow"); return; } int s = size++; shiftup(s,e); } public int size(){ return size; } private void shiftup(int s, int e) { while(s > 0){ int parent = (s - 1)/2; if(queue[parent] < e){ break; } queue[s] = queue[parent]; s = parent; } queue[s] = e; } public int poll(){ if(size <= 0) return -1; int ret = queue[0]; int s = --size; shiftdown(0, queue[s]); queue[s] = 0; return ret; } private void shiftdown(int i, int e) { int half = size /2; while(i < half ){ int child = 2*i +1; int right = child +1; if(right < size && queue[child] > queue[right]){ child = right; } if(e < queue[child]){ break; } queue[i] = queue[child]; i = child; } queue[i] = e; } public static void main(String args[]){ SmallHeap hs = new SmallHeap(); hs.add(4); hs.add(3); hs.add(7); hs.add(2); int size = hs.size(); for(int i=0; i< size; i++){ System.out.println(hs.poll()); } } }
動畫算法一 https://visualgo.net/en 動畫算法二 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 動畫算法三 http://www
一、排序算法導圖 二.算法實現 冒泡排序 1.算法簡介: 冒泡排序是所有排序算法中最簡單、最基本的一種。冒泡排序法的思路就是交換排序,通過相鄰數據的交換來達到排序的目的。 2.排序流程: 對數組的各個數據,依次比較相鄰的元素的大小; 如
代碼:queue.h#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define Status bool#define ERROR 0#define OVERFLOW -2#def
一: 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。 搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1
輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。 這道題最簡單的思路莫過於把輸入的n個整數排序,排序之後位於最前面的k個數就是最小的k個數。這種思路的時間複雜度是O(
判斷一個數是否爲2的n次方。 #include <iostream> using namespace std; bool is2N(int dest) { if (dest & (dest - 1)) //核心代碼 retu
對於一個字符串類型的表達式,實現基礎的加減乘除運算 String expression = "8/2+2*5-4"; 使用棧來實現這個表達式的解析和運算 實現思路: 1,通過一個index來遍歷我們的表達式 2,如果發現是一個數字,判斷
想了解更多數據結構以及算法題,可以關注微信公衆號“數據結構和算法”,每天一題爲你精彩解答。也可以掃描下面的二維碼關注 八皇后的來源 八皇后問題是一個以國際象棋爲背景的問題:如何能夠在8×8的國際象棋棋盤上放置八個皇后,使得任何一
</pre><p><pre name="code" class="java">/* * 散列表 */ public class HashTable { public static final int CAPACITY = 10;
線索二叉樹: 按照某種方式對二叉樹進行遍歷,可以把二叉樹中所有結點排序爲一個線性序列,在該序列中,除第一個結點外每個結點有且僅有一個直接前驅結點;除最後一個結點外每一個結點有且僅有一個直接後繼結點; 在有N個節點的二叉樹中需要利用N+
什麼是堆:堆是一種經過排序的完全二叉樹,其中任一非終端節點的數據值均不大於(或不小於)其左孩子和右孩子節點的值; 首先,堆分爲大根堆(最大堆)和小根堆(最小堆)二種; 小根堆滿足:
寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的
1.剪繩子(7.1) 題目描述 給你一根長度爲n的繩子,請把繩子剪成整數長的m段(m、n都是整數,n>1並且m>1,m<=n),每段繩子的長度記爲k[1],…,k[m]。請問k[1]x…xk[m]可能的最大乘積是多少?例如,當繩子
一、遞歸 1.藉助棧,實現3種遍歷的非遞歸算法。 2.層次遍歷是自頂向下、自左至右的遍歷二叉樹中的元素,可以藉助隊列實現。 二、具體實現 #include<stdio.h> #include<stdlib.
數組去重 function unique(arr) { const seen=new Map(); return arr.filter((a) => !seen.has(a)&& seen.set(a,1)); }