using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MaxHeap
{
public class MaxHeap<T>
{
private IComparer<T> mComparer;
private List<T> mItems;
private int mCount;
public MaxHeap()
{
mComparer = Comparer<T>.Default;
mItems = new List<T>();
mItems.Add(default(T));
mCount = 0;
}
public MaxHeap(IComparer<T> comparer)
{
mComparer = comparer;
mItems = new List<T>();
mItems.Add(default(T));
mCount = 0;
}
public void Insert(T n)
{
mCount++;
mItems.Add(n);
ShiftUp(mCount);
}
public T ExtractMax()
{
T ret = mItems[1];
Swap(1, mCount);
mCount--;
ShiftDown(1);
mItems.Remove(ret);
return ret;
}
public bool IsEmpty()
{
return mCount == 0;
}
private void ShiftDown(int n)
{
//是否有孩子节点
while(n*2<=mCount)
{
int j = n * 2;
if(j+1<=mCount && mComparer.Compare(mItems[j + 1],mItems[j])>0)
{
j++;//最大的节点
}
if(mComparer.Compare(mItems[n],mItems[j])>0)
{
break;
}
Swap(n, j);
n = j;
}
}
private void ShiftUp(int n)
{
while (n > 1 && mComparer.Compare(mItems[n], mItems[n / 2]) > 0)
{
Swap(n, n / 2);
n = n / 2;
}
}
private void Swap(int i,int j)
{
T tmpValue = mItems[i];
mItems[i] = mItems[j];
mItems[j] = tmpValue;
}
}
}
// See https://aka.ms/new-console-template for more information
namespace MaxHeap
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
MaxHeap<int> maxHeap = new MaxHeap<int>();
for (int i = 0; i < 10; i++)
{
maxHeap.Insert(i);
}
maxHeap.Insert(11);
while(maxHeap.IsEmpty() == false)
{
Console.WriteLine(maxHeap.ExtractMax());
}
Console.ReadKey();
}
}
}