把上面的序列变成一个完全二叉树,要想实现大顶堆(大顶堆:叶子节点不考虑,每个节点都要比他的两个孩子节点要大),就要进行如下操作,你会发现len/2就是最后一个非叶子节点
第一步是从下往上调
9和0换 、9和2换 、9和4换
经过第一步操作这个堆就如下图所示:
然后第二部开始,先让9和0交换位置
也就是最后一个元素与第一个元素进行交换,没交换一次,最后一个元素就–,进行调用
后面都是从上到下进行调整
依此类推,不再赘述
具体代码如下所示
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void PrintArray(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void MySwap(int arr[],int a,int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// myArr 待调整的数组
// index 待调整节点的下标
// len 数组的长度
void HeapAdjust(int arr[],int index,int len)
{
//先保存当前节点的下标
int max = index;
//保存左右孩子的数组下标
int lchild = index * 2 + 1;
int rchild = index * 2 + 2;
if (lchild < len && arr[lchild]>arr[max])
{
max = lchild;
}
if (rchild < len && arr[rchild]>arr[max])
{
max = rchild;
}
if (max != index)
{
//交换两个系欸但
MySwap(arr, max, index);
HeapAdjust(arr, max, len);
}
}
//堆排序
void HeapSort(int myArr[], int len)
{
//初始化堆
for (int i = len / 2 - 1; i >= 0; i--)
{
HeapAdjust(myArr,i,len);
}
//cout << myArr[0] << endl;
for (int i = len - 1; i >= 0; i--)
{
MySwap(myArr, 0, i);
HeapAdjust(myArr, 0, len);
}
}
int main()
{
int myArr[] = { 4,2,8,0,5,7,1,3,9};
int len = sizeof(myArr) / sizeof(int);
PrintArray(myArr, len);
//堆排序
HeapSort(myArr, len);
PrintArray(myArr, len);
system("pause");
return EXIT_SUCCESS;
}