堆排序算法的C++实现
Posted mingogo乔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序算法的C++实现相关的知识,希望对你有一定的参考价值。
复杂度:时间复杂度为O(n*log(n)), 非稳定排序,原地排序(空间复杂度O(1))
1. 对第i个父节点进行堆排序,条件:当前父节点下面层的所有非叶子节点都已完成堆排序
前情知识:使用数列表示树,对于第i个数,
它的根节点为 parent = (i-1)/2,取整
两个子节点分别为 2i+1 和 2i+2
template<class T>
void swap(T data[], int a, int b)
T temp = data[a];
data[a] = data[b];
data[b] = temp;
void heapify(T data[], int i, int size)
if(i >= size)
return;
//对当前子堆进行堆排序,找到最大值
int max = i;
if(2i+1 < size && data[2i+1] > data[max])
max = 2i+1;
if(2i+2 < size && data[2i+2] > data[max])
max = 2i+2;
if(max != i)
swap(data, i, max);
//进行交换后,可能破坏了已经完成的下层堆排序,需要对交换过的节点进行,进行一个推排序递归
heapify(dada, max, size);
2. 从底向上的对父节点依此进行堆排序(保证1的条件),完成堆的构建
前情知识:最后一个根节点,也就是最后一个节点的parent节点,为size/2-1(取整)。
template<class T>
void buildheap(T data[], int size)
for (int i = size/2-1; i >= 0; --i)
heapify(data, i, size);
3. 将最大值(根节点)和最后一个节点进行交换,砍断最大值,不断进行堆构建,即可从小到大排序
template<class T>
void heapsort(T data[], int size)
buildheap(data, size);
for (size; size > 0; --size)
swap(data, 0, size);
buildheap(data, size-1);
以上是关于堆排序算法的C++实现的主要内容,如果未能解决你的问题,请参考以下文章