基本排序算法---堆排序

基于c++的堆的升序排序

#include <iostream>
using namespace std;
int a[100]={0,1,2,3,4,5};
int n=5;
void swim(int k)
{
    //创建大顶堆,与双亲比遇见小的就上调到合适位置
    int m=k/2;
    while(a[k]>a[m])
    {
        swap(a[k],a[m]);
        k=m;
        m=k/2;
        if(k==1)
            break;
    }
}
void sink_em(int x,int end)
{
    int j=2*x;
    while(j<=end)
    {
        if(a[j]<=a[j+1]&&j+1<=end)
            j++;
        if(a[j]>a[x])
            swap(a[j],a[x]);
        x=j;
        j=x*2;
    }
}
void large_heap()
{
    int i=n/2;
    while(1)
    {
        sink_em(i,n);
        i--;
        if(i==0)
            break;
    }
}
void jianhuan()
{
    int i=n;
    while(i>1)
    {
        swap(a[1],a[i]);
        i--;
        sink_em(1,i);
    }
}
void print(int a[],int n)
{
    for(int i=1;i<=n;i++)
        cout<<a[i]<<"  ";
}
int main()
{
    /*
        1、构建大顶堆
        2、交换首尾
        3、排序结束、输出
    */
    large_heap();
    print(a,5);
    cout<<endl;
    jianhuan();
    print(a,5);
    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在学习堆排序之前,首先需要了解堆的含义:在含有 n 个元素的序列中,如果序列中的元素满足下面其中一种关系时,此序列...
    飞扬code阅读 4,982评论 0 4
  • 个人对堆排序的理解 第一步:是创建length堆,根节点要比子结点大。 第二步:把最父结点与最后一个叶子节点交换。...
    梁同桌阅读 2,994评论 0 0
  • 堆排序是利用“堆”这种数据结构而设计的一种排序算法,堆排序也是一种选择排序。一、堆堆是具有以下性质的完全二叉树:每...
    Qi0907阅读 4,876评论 0 0
  • Problem Description 实验要求:用堆排序算法按关键字递减的顺序排序。程序输入:待排序记录数(整数...
    vouv阅读 4,594评论 0 1
  • 术语解释: 大根堆:树中所有非终端节点的值,不小于左右孩子节点的完全二叉树 建初堆:将r[1..n]调整为大根堆 ...
    w8ed阅读 3,655评论 0 1