1. 程式人生 > >二叉堆(一)之 圖文解析 和 C語言的實現

二叉堆(一)之 圖文解析 和 C語言的實現

  1 /**
  2  * 二叉堆(最大堆)
  3  *
  4  * @author skywang
  5  * @date 2014/03/07
  6  */
  7 
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 
 11 #define LENGTH(a) ( (sizeof(a)) / (sizeof(a[0])) )
 12 
 13 static int m_heap[30];        // 資料
 14 static int m_capacity=30;    // 總的容量
 15 static
int m_size=0; // 實際容量(初始化為0) 16 17 /* 18 * 返回data在二叉堆中的索引 19 * 20 * 返回值: 21 * 存在 -- 返回data在陣列中的索引 22 * 不存在 -- -1 23 */ 24 int get_index(int data) 25 { 26 int i=0; 27 28 for(i=0; i<m_size; i++) 29 if (data==m_heap[i]) 30 return
i; 31 32 return -1; 33 } 34 35 /* 36 * 最大堆的向下調整演算法 37 * 38 * 注:陣列實現的堆中,第N個節點的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)。 39 * 40 * 引數說明: 41 * start -- 被下調節點的起始位置(一般為0,表示從第1個開始) 42 * end -- 截至範圍(一般為陣列中最後一個元素的索引) 43 */ 44 static void maxheap_filterdown(int start, int
end) 45 { 46 int c = start; // 當前(current)節點的位置 47 int l = 2*c + 1; // 左(left)孩子的位置 48 int tmp = m_heap[c]; // 當前(current)節點的大小 49 50 while(l <= end) 51 { 52 // "l"是左孩子,"l+1"是右孩子 53 if(l < end && m_heap[l] < m_heap[l+1]) 54 l++; // 左右兩孩子中選擇較大者,即m_heap[l+1] 55 if(tmp >= m_heap[l]) 56 break; //調整結束 57 else 58 { 59 m_heap[c] = m_heap[l]; 60 c = l; 61 l = 2*l + 1; 62 } 63 } 64 m_heap[c] = tmp; 65 } 66 67 /* 68 * 刪除最大堆中的data 69 * 70 * 返回值: 71 * 0,成功 72 * -1,失敗 73 */ 74 int maxheap_remove(int data) 75 { 76 int index; 77 // 如果"堆"已空,則返回-1 78 if(m_size == 0) 79 return -1; 80 81 // 獲取data在陣列中的索引 82 index = get_index(data); 83 if (index==-1) 84 return -1; 85 86 m_heap[index] = m_heap[--m_size]; // 用最後元素填補 87 maxheap_filterdown(index, m_size-1); // 從index位置開始自上向下調整為最大堆 88 89 return 0; 90 } 91 92 /* 93 * 最大堆的向上調整演算法(從start開始向上直到0,調整堆) 94 * 95 * 注:陣列實現的堆中,第N個節點的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)。 96 * 97 * 引數說明: 98 * start -- 被上調節點的起始位置(一般為陣列中最後一個元素的索引) 99 */ 100 static void maxheap_filterup(int start) 101 { 102 int c = start; // 當前節點(current)的位置 103 int p = (c-1)/2; // 父(parent)結點的位置 104 int tmp = m_heap[c]; // 當前節點(current)的大小 105 106 while(c > 0) 107 { 108 if(m_heap[p] >= tmp) 109 break; 110 else 111 { 112 m_heap[c] = m_heap[p]; 113 c = p; 114 p = (p-1)/2; 115 } 116 } 117 m_heap[c] = tmp; 118 } 119 120 /* 121 * 將data插入到二叉堆中 122 * 123 * 返回值: 124 * 0,表示成功 125 * -1,表示失敗 126 */ 127 int maxheap_insert(int data) 128 { 129 // 如果"堆"已滿,則返回 130 if(m_size == m_capacity) 131 return -1; 132 133 m_heap[m_size] = data; // 將"陣列"插在表尾 134 maxheap_filterup(m_size); // 向上調整堆 135 m_size++; // 堆的實際容量+1 136 137 return 0; 138 } 139 140 /* 141 * 列印二叉堆 142 * 143 * 返回值: 144 * 0,表示成功 145 * -1,表示失敗 146 */ 147 void maxheap_print() 148 { 149 int i; 150 for (i=0; i<m_size; i++) 151 printf("%d ", m_heap[i]); 152 } 153 154 void main() 155 { 156 int a[] = {10, 40, 30, 60, 90, 70, 20, 50, 80}; 157 int i, len=LENGTH(a); 158 159 printf("== 依次新增: "); 160 for(i=0; i<len; i++) 161 { 162 printf("%d ", a[i]); 163 maxheap_insert(a[i]); 164 } 165 166 printf("\n== 最 大 堆: "); 167 maxheap_print(); 168 169 i=85; 170 maxheap_insert(i); 171 printf("\n== 新增元素: %d", i); 172 printf("\n== 最 大 堆: "); 173 maxheap_print(); 174 175 i=90; 176 maxheap_remove(i); 177 printf("\n== 刪除元素: %d", i); 178 printf("\n== 最 大 堆: "); 179 maxheap_print(); 180 printf("\n"); 181 }

相關推薦

Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆() 圖文解析 C語言實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

() 圖文解析 C語言實現

1 /** 2 * 二叉堆(最大堆) 3 * 4 * @author skywang 5 * @date 2014/03/07 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h

資料結構 伸展樹個人筆記 伸展樹() 圖文解析 C語言實現

閱讀了skywang的伸展樹的講解,覺得講的很不錯,再次也推薦大家無論是新手還是老手都可以去閱讀下。 ----------------------------------------------------------------------------------------- 伸展樹(一)之 圖文

排序樹(BST)的思路及C語言實現

請注意,為了能夠更好的理解二叉排序樹,我建議各位在看程式碼時能夠設定好斷點一步一步跟蹤函式的執行過程以及各個變數的變化情況 一.動態查詢所面臨的問題 在進行動態查詢操作時,如果我們是在一個無序的線性表中進行查詢,在插入時可以將其插入表尾,表長加1即可;刪除時

【演算法】樹的遞迴遍歷C語言實現

二叉樹是一種極其重要的資料結構,以下是二叉樹的結構定義 建立 和遞迴先序 中序 後序 遍歷的程式碼. #include<stdio.h> #include<stdlib.h> typedef char ElemType; /*二叉樹節點資料

(三) Java的實現

1 /** 2 * 二叉堆(最大堆) 3 * 4 * @author skywang 5 * @date 2014/03/07 6 */ 7 8 import java.util.ArrayList; 9 import java.util.L

matlabC語言實現最小乘法

參考:https://blog.csdn.net/zengxiantao1994/article/details/70210662 Matlab程式碼: N = 8; x = [1 2 3 4 5 6 7 8 ]; y = [67 84 102 120 137 1

利用鏈式佇列實現樹的層次遍歷(C語言

規則: 判斷樹是否為空,為空則返回; 若不空,從樹的第一層。也就是根節點開始訪問。 從上而下逐層遍歷, 在同一層中,按從左到右的順序對節點逐個訪問。 #include<stdio.h> #include<stdlib.h> t

中序遍歷樹(非遞迴演算法 c語言

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定義二叉樹資料結構 {  

搜尋樹層序遍歷C語言

  層序遍歷,寫完了,感慨下.   不同於前序遍歷,中序遍歷,後序遍歷,層序遍歷沒有使用棧模式,而是使用了佇列.   佇列中的資料,即QueueItem是二叉搜尋樹結點指標,這樣可以儲存結點,並且可以方便處理棧為空時返回值的問題.也就是可以返回NULL.   用一個函式實現,

資料結構學習筆記——線性表順序表(c語言實現

1.概念 順序表即線性表的順序儲存結構 ,指的是用一段地址連續的儲存單元依次儲存線性表資料元素。線上性表中,每個資料元素的型別都相同,一般可以用一維陣列來實現順序儲存結構。 2.實現 (1)建立順序表的結構 利用c語言結構體來建立順序表的結構,順序表結構體中

資料結構排序演算法歸併排序(c語言實現

博主身為大二萌新,第一次學習資料結構,自學到排序的時候,對於書上各種各樣的排序演算法頓覺眼花繚亂,便花了很長的時間盡力把每一個演算法都看懂,但限於水平有限,可能還是理解較淺,於是便將它們逐個地整理實現出來,以便加深理解。 歸併排序就是通過將一個具有n個key記錄的線性表,看

棧的操作c語言實現算術表示式求值

</pre><p><span style="font-size:18px;">棧是一種特殊的線性表,按照“後進先出”的原則處理資料。</span></p><p><span style="font

演算法並查集 C語言實現3

標頭檔案 UnionFind3.h #ifndef UNIONFIND3_H_INCLUDED #define UNIONFIND3_H_INCLUDED #include "stdlib.h" #include "ASSERT.h" typedef stru

CRC校驗的理解C語言實現

1、CRC是什麼 CRC檢驗的基本思想是利用線性編碼理論,在傳送端根據要傳送的k位二進位制碼序列,以一定的規則產生一個檢驗碼r位(就是CRC碼),附在資訊後面,構成一個新的二進位制碼序列數共(k+r)位,最後傳送出去。接收端根據同樣的規則校驗,以確定傳送中是否

資料結構()——順序表(C語言實現

定義 實現 定義結構 定義操作 建立順序表 插入元素 刪除元素 銷燬順序表 定義 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。根據資料元素之間關係的不同特性,通常有如下4類基本結構: 集合:結構中的資料元素之間除了

資料結構排序演算法快速排序(c語言實現

快排的原理就是通過一趟排序將待排記錄分割成獨立的兩部分,其中的一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。這其中,可以使用遞迴呼叫某一關鍵函式的辦法來實現這樣的功能。 分割的方法就是,選取一個樞軸,將所有關鍵字比它

【程式設計美】用C語言實現狀態機(實用)

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https://www.cnblogs.com/lihuidashen/p/11510532.html https://mp.weixin.qq.com/s/xDAfaEFY

資料結構圖文解析詳解及C++模板實現

0. 資料結構圖文解析系列 1. 二叉堆的定義 二叉堆是一種特殊的堆,二叉堆是完全二叉樹或近似完全二叉樹。二叉堆滿足堆特性:父節點的鍵值總是保持固定的序關係於任何一個子節點的鍵值,且每個節點的左子樹和右子樹都是一個二叉堆。 當父節點的鍵值總是大於或等於任何一個子節點的鍵值時為最大堆。 當父節點的鍵值總是小於

d-的性能比較

合並 http ext center 對比 bsp tro -a nbsp 時間復雜度的對比,d-堆插入較快,合並較快 二叉堆和d-堆的性能比較