栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

在介绍堆排序之前,的先介绍一下堆是什么,堆是一种非线性结构,是一颗完全二叉树。
大顶堆,就是指:每个结点的值都大于或等于其左右孩子节点的值,
小顶堆: 每个结点的值都小于或等于其左右孩子结点的值。
大顶堆,小顶堆的形状:

首先当你得到一个数组的时候,它就是一个堆。比如说,我得到的数组是5,4,3,6,9,10,13,12

那么上图就是一个初始堆。然后建立大顶堆,从最后一个父结点开始,建立大顶堆,把最大值改到父结点处。

这是一次建立大顶堆之后的结果,
然后根结点与最后一个叶子结点交换位置,最后一个叶子结点退出排序队列。
迭代,知道所有元素退出排序队列。

#include
#include
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 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);      //大顶堆根结点跟未排序的最后一个结点互换。
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769065.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号