“堆”定义
n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一棵 完全二叉树 的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。时间复杂度:O(nlogn)
堆排序是就地排序,辅助空间为O(1),
C# Code:
public void HeapSort(int[] arr)
{
//针对非叶子结点进行调整
int i = arr.Length / 2 - 1;
while (i >= 0)
{
HeapAdjust(arr, i, arr.Length);
i--;
}
i = arr.Length - 1;
int temp = 0;
for (i = arr.Length - 1; i > 1; --i)
{
temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
HeapAdjust(arr, 0, i - 1);
}
}
private void HeapAdjust(int[] arr, int cur, int arrLeng)
{
int temp, child;
int i = arrLeng;
temp = arr[cur];
child = 2 * cur + 1;
while (child < arrLeng)
{
if (child < arrLeng && arr[child] <= arr[child + 1])
child++;
if (temp > arr[child])
break;
arr[cur] = arr[child];
cur = child;
child = 2 * child + 1;
}
arr[cur] = temp;
}