using System;
namespace 堆排序___顺序存储
{
class Program
{
static void Main(string[] args)
{
int[] data = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };
HeapSort(data);
foreach (int i in data)
Console.Write(i + " ");
Console.ReadKey();
}
public static void HeapSort(int[] data)
{
for (int i = data.Length / 2; i >= 1; i--)
HeapAjust(i, data, data.Length);
for (int i = data.Length; i > 1; i--)
{
int temp1 = data[0];
data[0] = data[i - 1];
data[i - 1] = temp1;
HeapAjust(1, data, i - 1);
}
}
private static void HeapAjust(int numberToAjust, int[] data, int maxNumber)
{
int maxNodeNumber = numberToAjust;
int tempI = numberToAjust;
while (true)
{
int leftChildNumber = tempI * 2;
int rightChildNumber = leftChildNumber + 1;
if (leftChildNumber <= maxNumber && data[leftChildNumber - 1] > data[maxNodeNumber - 1]) maxNodeNumber = leftChildNumber;
if (rightChildNumber <= maxNumber && data[rightChildNumber - 1] > data[maxNodeNumber - 1]) maxNodeNumber = rightChildNumber;
if (maxNodeNumber != tempI)
{
int temp = data[tempI - 1];
data[tempI - 1] = data[maxNodeNumber - 1];
data[maxNodeNumber - 1] = temp;
tempI = maxNodeNumber;
}
else break;
}
}
}
}
思路:将数组构造成最大堆,此时根节点位置为最大元素,然后将第一个元素与末尾元素交换,使最大元素置于数组末端,之后继续将剩余堆构造成最大堆,重复该操作。时间复杂度为O(nlogn)。