堆排序是一种常见的排序算法,因为他的时间复杂度相比较于其他排序来说是比较优化的了。他的思想就是:先建一个大堆(即堆顶元素是堆中最大的),然后将堆顶元素与堆的最后一个元素交换,堆的大小减一(此时堆中最后一个元素已经是堆中最大的了),然后对剩下的元素再进行排序,如此循环,当堆中元素只剩一个的时候堆排序就完成了。
#include<iostream>
using namespace std;
#include<assert.h>
void AdjustDown(int *a, int root, size_t size) //向下调整
{
int parent = root;
int child = parent * 2 + 1;
while (child < size)
{
if (child + 1 < size&&a[child + 1] > a[child]) //找到左右孩子最大的那个
++child;
if (a[child]>a[parent]) //大堆,孩子节点要小于父亲节点
{
swap(a[child], a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void Heapsort(int *a, size_t size) //堆排序
{
assert(a);
for (int i = (size - 2) / 2; i >= 0; --i) //建堆
{
AdjustDown(a, i, size);
}
size_t end = size - 1; //end为数组a中最后一个元素
while (end > 0)
{
swap(a[0], a[end]); //交换栈顶元素和栈顶元素
AdjustDown(a, 0, end); //调整
--end;
}
}