附代码如下:
#include< iostream >
using namespace std;
typedef int ElemType;
//堆的初始化—如何将一个序列调整为一个大根堆
//建堆操作
void AdjustDown(ElemType A[], int k, int len)
{
A[0] = A[k];
for (int i = 2 * k; i <= len; i *= 2) {
if (i < len && A[i] < A[i + 1])
i++;
if (A[0] >= A[i])
break;
else {
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void BuildMaxHeap(ElemType A[], int len) {
for (int i = len / 2; i > 0; i–)
AdjustDown(A, i, len);
}
//堆排序 附:时间复杂度O(nlog2 n) 空间复杂度O(1)
void Swap(ElemType A[], int i)
{
cout<<A[1]<<endl;
int x;
x=A[1];
A[1]=A[i];
A[i]=x;
}
void HeapSort(ElemType A[], int len) {
BuildMaxHeap(A, len);
for (int i = len; i > 1; i–) {
Swap(A, i);
AdjustDown(A, 1, i - 1);
}
}
int main()
{
ElemType A[] = { 0,12,19,18,16,14,5,7,9,11,21}; //待排序序列的0号为应该为空
HeapSort(A, 11);
cout << “Waiting…” << endl;
}
以上为堆排序执行代码,详解如下
引入概念大根堆和小根堆
大根堆:第i个节点值大于等于2i和2i+1节点的值
小根堆:第i个节点值小于等于2i和2i+1节点的值
0<i<=len/2
len为该序列长度
算法原理
通过对树中各节点的值进行交换 从而使根节点值为最大 其孩子节点值次之 依次向下