using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestCSharp
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int> { 6, 4, 3, 7, 5, 8, 2, 1, 9 };
Sort(list);
foreach (var item in list)
{
Console.Write(item + ", ");
}
Console.WriteLine("");
Console.ReadKey();
}
static void Sort(List<int> list)
{
for (int i = list.Count / 2 - 1; i >= 0; --i)
{
ConstructMaxHeap(list, i, list.Count);
}
for (int i = list.Count - 1; i > 0; --i)
{
Swap(list, 0, i);
ConstructMaxHeap(list, 0, i);
}
}
static void Swap(List<int> list, int index0, int index1)
{
var temp = list[index0];
list[index0] = list[index1];
list[index1] = temp;
}
static void ConstructMaxHeap(List<int> list, int parentIndex, int constructLength)
{
var parentValue = list[parentIndex];
for (int childIndex = parentIndex * 2 + 1; childIndex < constructLength; childIndex = childIndex * 2 + 1)
{
if (childIndex + 1 < constructLength && list[childIndex + 1] > list[childIndex])
{
childIndex++;
}
if (list[childIndex] > parentValue)
{
list[parentIndex] = list[childIndex];
parentIndex = childIndex;
}
else
{
break;
}
}
list[parentIndex] = parentValue;
}
static void Sort_Min(List<int> list)
{
for (int i = list.Count / 2 - 1; i >= 0; --i)
{
ConstructMinHeap(list, i, list.Count);
}
for (int i = list.Count - 1; i > 0; --i)
{
Swap(list, 0, i);
ConstructMinHeap(list, 0, i);
}
}
static void ConstructMinHeap(List<int> list, int parentIndex, int constructLength)
{
var parentValue = list[parentIndex];
for (int childIndex = parentIndex * 2 + 1; childIndex < constructLength; childIndex = childIndex * 2 + 1)
{
if (childIndex + 1 < constructLength && list[childIndex + 1] < list[childIndex])
{
childIndex++;
}
// 由于是从下到上,因此,下面的是已经排好序的,因此,现在只需要插入排序,看parentValue放在哪里合适
if (list[childIndex] < parentValue)
{
list[parentIndex] = list[childIndex];
parentIndex = childIndex;
}
else
{
break;
}
}
list[parentIndex] = parentValue;
}
}
}