最小堆操作(元素的新增和刪除)

2021-06-21 14:51:05 字數 2223 閱讀 4952

先引用我一直很膜拜的牛人

morewindows

在堆排序中的一段內容,該內容詳細講述了最小堆,以及在最小堆中新增

/刪除元素的原理。

二叉堆的定義

二叉堆是完全二叉樹或者是近似完全二叉樹。

二叉堆滿足二個特性:

1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。

2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。

當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。下圖展示乙個最小堆:

由於其它幾種堆(二項式堆,斐波納契堆等)用的較少,一般將二叉堆就簡稱為堆。

堆的操作——插入刪除

堆的儲存

一般都用陣列來表示堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。

下面先給出《資料結構c++語言描述》中最小堆的建立插入刪除的**,再給出本人的實現**,最好是先看明白圖後再去看**。

下面的內容是我自己編寫的乙個在最小堆上新增、刪除元素的演算法示例。首先建立了乙個堆操作的介面,方便以後對堆操作的擴充套件。

public inte***ce heapoperation
1.最小堆新增元素

最小堆新增元素的操作流程類似於

排序演算法之插入演算法

,先將需要新增的元素插入陣列尾部,然後按照插入演算法對堆進行調整。

public int addnumber(int array, int length, int num) 

newarray[length] = num;

minheapfixup(newarray, length + 1);

return newarray;

}

private void minheapfixup(int array, int length) 

array[i] = array[j];

i = j;

j = (i - 1) / 2;

} array[i] = temp;

}

對函式minheapfixup進行簡化,如下:

private void minheapfixup(int array, int i) 

}

其中swap函式是將陣列array的腳標為k和j的兩個元素進行交換。

private void swap(int array, int i, int j)
2.最小堆刪除元素

按照最小堆刪除元素步驟,演算法設計如下:

public int deletenumber(int array, int length)

private int mixheapfixdown(int array, int i, int n) 

if(array[j] >= temp)

array[i] = array[j];

i = j;

j = 2 * i + 1;

} array[i] = temp;

for(j = 0; j < n; j++)

return newarray;

}

對上述演算法進行驗證,結果與理論結果一致。

public class client 

} public static void main(string args) ;

minheapoperation mho = new minheapoperation();

int arrayforadd = mho.addnumber(array, array.length, 15);

print(arrayforadd);

system.out.println();

int arrayfordelete = mho.deletenumber(arrayforadd, arrayforadd.length);

print(arrayfordelete);

}}

最小堆插入元素和刪除堆頂(無哨兵元素) 20分

6 1 最小堆插入元素和刪除堆頂 無哨兵元素 20分 對於給定的最小堆 優先佇列 分別實現插入元素和刪除堆頂的函式。函式介面定義 int insertintoheap struct heap h,int x 向堆中插入元素x int deletemin struct heap h,int pelem...

最小堆的建立 插入 與刪除

堆是完全二叉樹,完全二叉樹最大的特點就是 把資料儲存在陣列裡 通過父子結點的關係來做 不用實際建樹 parent leftchild 2 leftchild 2 parent 右就加1這兒指的是序號關係,儲存的時候注意是利用樹的邏輯圖 從上到下 從左到右編號12345.建堆 實際是把資料先放入陣列 ...

陣列的刪除元素和新增元素

思路分析 a.我們首先確定哪些元素是需要移動位置的 插入的位置比如說插入到3後面 按照索引就是索引為2後面的元素都需要移動。b.元素從後面移動,這樣移動簡單。int arr 6 for int i 5 i 2 i i 2 表示 移動的是3後面的元素 arr 3 4 for int n 0 n 6 n...