在大量数据中找最大或最小一些元素时,使用堆排序往往会很高效,那么堆排序是如何实现的呢?首先通过堆进行排序必须得建一个堆,其次得明白升序,降序该建大堆还是小堆?
对于堆排序,我们必须得清楚以下几点:
1.通常我们采用升序建大堆,降序建小堆的方法;
2.建好堆之后,下来就要对堆进行排序了;
以升序为例:首先将这组数据建一个大堆,建好之后交换堆顶与最后一个元素(堆顶元素肯定是堆中最大的数),这会儿最大的那个数就调到了最后,然后再将不包含最后一个元素的堆从根节点起进行向下调整,使其依然满足大堆的特点;
下一次再进行调整的时候,依然交换堆顶元素和最后一个元素,再将不包含最后一个元素的堆从根节点起进行向下调整……直至下调元素个数为0.
首先实现大堆升序:
#include<iostream>
#include
using namespace std;
void AdjustDown(int*a, size_t root, size_t size)
{
size_t parent = root;
size_t child = parent * 2+ 1;
while(child < size)
{
if(child + 1< size && a[child] < a[child + 1])
{
++ch