首页 > 代码库 > 堆排序

堆排序

  堆排序是一种常见的排序算法,因为他的时间复杂度相比较于其他排序来说是比较优化的了。他的思想就是:先建一个大堆(即堆顶元素是堆中最大的),然后将堆顶元素与堆的最后一个元素交换,堆的大小减一(此时堆中最后一个元素已经是堆中最大的了),然后对剩下的元素再进行排序,如此循环,当堆中元素只剩一个的时候堆排序就完成了。

#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;
    }
}

堆排序