【排序算法】堆排序算法原理及C++实现

在介绍堆排序之前,的先介绍一下堆是什么,堆是一种非线性结构,是一颗完全二叉树。
大顶堆,就是指:每个结点的值都大于或等于其左右孩子节点的值,
小顶堆: 每个结点的值都小于或等于其左右孩子结点的值。
大顶堆,小顶堆的形状:
在这里插入图片描述
首先当你得到一个数组的时候,它就是一个堆。比如说,我得到的数组是5,4,3,6,9,10,13,12
在这里插入图片描述
那么上图就是一个初始堆。然后建立大顶堆,从最后一个父结点开始,建立大顶堆,把最大值改到父结点处。
在这里插入图片描述
这是一次建立大顶堆之后的结果,
然后根结点与最后一个叶子结点交换位置,最后一个叶子结点退出排序队列。
迭代,知道所有元素退出排序队列。

#include<iostream>
#include<new>
void swap(int* a, int b, int c);
void buildBigHeap(int* a, int n);
void HeapSort(int* a, int n);
int main()
{
    using namespace std;
    int n;
    cin >> n;
    int* a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    HeapSort(a,n);
    for (int i = 0; i < n; i++)
        cout << a[i] << endl;
    return 0;
}
void swap(int* a, int b, int c)
{
    int temp = a[b];
    a[b] = a[c];
    a[c] = temp;
}
void buildBigHeap(int* a, int n)
{
    int LastFatherNode = n / 2-1;
    for (int i = LastFatherNode; i >= 0; i--)
    {
        if (a[(i + 1) * 2 - 1] > a[i])
            swap(a, (i + 1) * 2 - 1, i);
        if((i+1)*2<n && a[(i + 1) * 2] > a[i])
            swap(a, (i + 1) * 2 , i);
    }
}
void HeapSort(int* a, int n)
{
    for (int i = n; i > 0; i--)
    {
        buildBigHeap(a, i);     //建造大顶堆,将最大值放在根结点
        swap(a, 0, i - 1);      //大顶堆根结点跟未排序的最后一个结点互换。
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值