堆排序:
class Program
{
static void Main(string[] args)
{
int[] nums = { 1, 4, 8, 0, 3, 6, 9, 2 };
HeapSort(nums);
for (int i = 0; i < nums.Length; i++)
{
Console.Write(nums[i] + " ");
}
Console.ReadKey();
}
static void HeapSort(int[] nums)
{
// 构造成大顶堆
for (int i = nums.Length / 2; i >= 1; i--)
{
AdjustArray(nums, i, nums.Length);
}
// 进行排序
for (int i = nums.Length; i > 1; i--)
{
int temp1 = nums[0];
nums[0] = nums[i - 1];
nums[i - 1] = temp1;
AdjustArray(nums, 1, i - 1);
}
}
static void AdjustArray(int[] nums, int NumberToAdjust, int maxNumber)
{
int maxNumberIndex = NumberToAdjust;
int tempI = NumberToAdjust;
while (true)
{
int leftNumberIndex = 2 * tempI;
int rightNumberIndex = 2 * tempI + 1;
if (leftNumberIndex <= maxNumber && nums[leftNumberIndex - 1] > nums[maxNumberIndex - 1])
{
maxNumberIndex = leftNumberIndex;
}
if (rightNumberIndex <= maxNumber && nums[rightNumberIndex - 1] > nums[maxNumberIndex - 1])
{
maxNumberIndex = rightNumberIndex;
}
if (maxNumberIndex != tempI)
{
int temp = nums[maxNumberIndex - 1];
nums[maxNumberIndex - 1] = nums[tempI - 1];
nums[tempI - 1] = temp;
tempI = maxNumberIndex;
}
else
{
break;
}
}
}
}