堆排序的主要步骤包括:
1、对要排序的数组建堆,此时堆顶(也就是数组第一个元素)要么最大,要么最小;
2、交换数组第一个和最后一个元素;
3、数组长度减1;
4、保持最大堆或最小堆的特性;
5、重复2、3、4,直至数组长度为1,结束。
代码如下:
#include <iostream>
using namespace std;
// 保持最大堆函数
void MaxHeapify(int A[], int size, int i)
{
int max = i; // max标识当前节点、其左子节点、其右子节点中内容最大的一个节点下标
int left = 2*i + 1; // 左子节点
int right = 2*i + 2; // 右子节点
if (left < size && A[left] > A[i])
{
max = left;
}
if (right < size && A[right] > A[max])
{
max = right;
}
if (max != i)
{
int temp = A[i];
A[i] = A[max];
A[max] = temp;
MaxHeapify(A, size, max);
}
}
void HeapSort(int A[], int size)
{
// 建堆
for (int i=size/2-1; i>=0; i--)
{
MaxHeapify(A, size, i);
}
// 排序,注意:使用最大堆保持函数,最后所得的结果是按从小到大排序的
while (size > 1)
{
int temp = A[0];
A[0] = A[size-1];
A[size-1] = temp;
MaxHeapify(A, --size, 0);
}
}
void main()
{
// 初始化要排序的数组
int A[] = {4,1,3,2,16,9,10,14,8,7};
// 排序
HeapSort(A, sizeof(A)/sizeof(int));
// 打印排序结果
for (int i=0; i<sizeof(A)/sizeof(int); i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
}
结果如下: