[C++] 纯文本查看 复制代码
#include <stdio.h>
// 维护最大堆的性质
void MaxHeapify(int arrInt[], size_t i, size_t nHeapSize)
{
size_t nLeft = 2 * i + 1;
size_t nRight = 2 * i + 2;
size_t nLarge;
if (nLeft <= nHeapSize && arrInt[nLeft] > arrInt)
nLarge = nLeft;
else
nLarge = i;
if (nRight <= nHeapSize && arrInt[nRight] > arrInt[nLarge])
nLarge = nRight;
if (nLarge != i)
{
int nTemp = arrInt;
arrInt = arrInt[nLarge];
arrInt[nLarge] = nTemp;
MaxHeapify(arrInt, nLarge, nHeapSize);
}
}
// 数组转换为最大堆
void BuildMaxHeap(int arrInt[], size_t nLength)
{
for (intptr_t i = nLength / 2; i >= 0; i--)
MaxHeapify(arrInt, i, nLength);
}
// 堆排序(原址排序)
void HeapSort(int arrInt[], size_t nLength)
{
BuildMaxHeap(arrInt, nLength);
for (size_t i = nLength; i >= 1; i--)
{
int nTemp = arrInt[0];
arrInt[0] = arrInt;
arrInt = nTemp;
nLength--;
MaxHeapify(arrInt, 0, nLength);
}
}
int main()
{
int arrInt[] = { 88, -100, 5, 4, 3, 2, 1, 10, 9, 8, 7, 6, -1, -2, -3, -4, -5 };
size_t nCount = sizeof(arrInt) / sizeof(arrInt[0]);
HeapSort(arrInt, nCount - 1);
for (size_t i = 0; i < nCount; i++)
printf("%d\n", arrInt);
return 0;
}