先引用我一直很膜拜的牛人
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...