堆的常用操作(新建堆,插入元素,刪除堆頂)
理論:
1、downadjust(low,high)的作用是調整這個閉區間範圍內的元素,使其滿足堆的性質;呼叫此函式的前提是除了low之外,其他節點滿足堆的性質;
2、createheap()在建堆時是倒著從第乙個非葉節點元素開始呼叫downadjust();
3、deleteheap()是將最後乙個元素與第乙個元素交換,這樣現在除了根節點外,其他節點都是堆,呼叫一次downadjust()就可以了;
4、upadjust(low,high)是在除了high元素外,其他節點都滿足堆的性質,逐次向上調整為堆;
4、insertheap(data)是在最後加乙個元素,然後向上調整;
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
100;
int heap[maxn]
, n;
//對heap陣列在[low, high]範圍內進行向下調整,
//low為待調整元素的下標,high一般為堆最後乙個元素的下標
void
downadjust
(int low,
int high)
else}}
//完全二叉樹的性質:葉子結點的個數為 n/2 向上取整,非葉子節點有 n/2 向下取整個
void
createheap()
}//刪除堆頂元素
void
deletetop()
//向上調整元素
void
upadjust
(int low,
int high)
else
break;}
}void
insertheap
(int data)
intmain()
createheap()
;for
(int i =
1; i <= n; i++
)printf
("\n");
deletetop()
;for
(int i =
1; i <= n; i++
)printf
("\n");
insertheap(50
);for(
int i =
1; i <= n; i++
)printf
("\n");
system
("pause");
return0;
}
堆排序理論:
1、簡單思路是每次取出第乙個元素並刪除,將最後乙個元素放到第一位,並呼叫downadjust()向下調整;
2、好的方法是倒著列舉,交換最後一位與第一位,這樣最後一位就是最大值;
但是第一位元素不符合堆的性質,只要呼叫downadjust()向下調整一次就可以了;最後陣列是從小到大排序;
void
heapsort()
}
演算法筆記 堆
堆是一種特殊的樹形資料結構,一般討論的堆都是二叉堆。堆的特點是根結點的值是所有結點中最小的或者最大的,並且根結點的兩個子樹也是乙個堆結構。堆是一種比較特殊的資料結構,可以被看做一棵樹的陣列物件,具有以下的性質 堆中某個節點的值總是不大於或不小於其父節點的值 堆總是一棵完全二叉樹。將根節點最大的堆叫做...
演算法 之 堆 建立堆
給出乙個有n個元素的陣列a 1.n 要建立乙個包含這些元素的堆,可以這樣進行 從空的堆開始,不斷插入每乙個元素,直到a完全被轉移到堆中為止。因為插入第j個鍵值用時o log j 因此用這種方法建立堆疊的時間複雜性是o n log n 我們知道對應於堆h 1.n 的樹的節點可以方便地以自頂向下 從左到...
演算法筆記 資料結構 堆
堆是一棵完全二叉樹,樹中每個結點的值都不小於 或者不大於 其左右孩子結點的值 對於給定初始序列,如何建堆?給定陣列 85,55,82,57,68,92,99,98,66,56 建堆過程如下 利用陣列來儲存完全二叉樹,這樣結點就按層序儲存與陣列中,其中第乙個結點將儲存於陣列的1號位,並且陣列i號位表示...