什么是堆?
如果下面这张图看不懂的话,那就戳这个什么是堆
那我们今天主要来看怎么利用堆的性质来进行堆排序
初始数组: int arr[]={2,5,4,9,3,6,8,7};
^_^以下介绍升序排序的步骤
第一步:用数组元素创建堆
【代码实现】
#include<iostream>
using namespace std;
#include<assert.h>
void AdjustDown(int*arr, int sz, int parent)
{
int child = parent * 2 + 1;
while (child < sz)
{
//选出左右子树中最大的
if (child + 1 < sz&&arr[child + 1] > arr[child])
{
child++;
}
//如果该结点的孩子有比该节点大的,就交换
if (arr[child] > arr[parent])
{
swap(arr[child], arr[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void HeapSort(int* arr, int sz)
{
int root = (sz - 1 - 1) >> 1;//从第一个非叶子结点的位置开始调整
for (; root >= 0; --root)
AdjustDown(arr, sz, root);//向下调整
int end = sz - 1;//标记最后一个结点的下标
while (end)
{
swap(arr[0], arr[end]);
AdjustDown(arr, end, 0);
end--;
}
}
void Print(int *arr, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 2, 5, 4, 9, 3, 6, 8, 7 };
HeapSort(arr, sizeof(arr) / sizeof(arr[0]));
Print(arr, sizeof(arr) / sizeof(arr[0]));
system("pause");
return 0;
}