class Program
{
static void Main(string[] args)
{
int[] arr = { 4, 10, 3, 5, 1, 2,16};
int size = arr.Length;
Heapsort(arr, size);
foreach (int item in arr)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
public static void swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void Heapsort(int[] tree, int n)
{
build_heap(tree, n);
int i;
for (i = n - 1; i >= 0; i--)
{
swap(tree, i, 0);
heapify(tree, i, 0);
}
}
public static void build_heap(int[] tree, int n)
{
int last_node = n - 1;
int parent = (last_node - 1)/2;
int i;
for (i = parent; i >= 0; i--)
{
heapify(tree, n, i);
}
}
public static void heapify(int[] tree,int n,int i)
{
if (i >= n) {
return;
}
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;//假设max是最大数值
//假设c1和c2不存在不需要往下判断
if (c1 < n && tree[c1] > tree[max])
{
max = c1;
}
if (c2 < n && tree[c2] > tree[max])
{
max = c2;
}
if (max != i) //需要做交换
{
swap(tree, max, i);
heapify(tree, n, max);
}
}
/*
* parent=(i-1)/2
* c1= 2i+1
* c2= 2i+2
*/
}