美文网首页
数据结构与算法之堆排序

数据结构与算法之堆排序

作者: LiChangBao | 来源:发表于2018-04-10 10:10 被阅读0次

小根堆--向下构建

#include<stdio.h>

int a[101],n;

void swap(int i,int t)
{
    int temp;

    temp = a[i];
    a[i] = a[t];
    a[t] = temp;
}

//向下构建
void siftdown(int i)
{
    int flag=0,t;

    while(flag==0&&2*i<=n)//表示存在结点
    {
        if(a[i]>a[2*i])//比左结点大
        {
            t = 2*i;
        }
        else
        {
            t = i;
        }

        if(2*i+1<=n)//表示存在右节点
        {
            if(a[t]>a[2*i+1])//此处容易出错!是a[t]而不是a[i],自己想想为什么!最经典部分之一
            {
                t = 2*i + 1;
            }
        }

        if(t!=i)
        {
            swap(i,t);
            i = t;//这一句,我认为是堆排序最经典的部分之二。
        }
        else
        {
            flag = 1;
        }
    }
}

void creat()
{
    int i;

    for(i=n/2;i>=1;i--)//堆排序最经典之3
    {
        siftdown(i);
    }
}

int deletemax()
{
    int t;

    t = a[1];
    a[1] = a[n];
    n--;        //堆排序最经典之4
    siftdown(1);

    return t;
}
int main()
{
    int i,num;

    printf("请输入堆中元素个数:");
    scanf("%d",&num);
    n = num;

    //对堆进行初始化
    printf("请输入待排序的元素:");
    for(i=1;i<=num;i++)
    {
        scanf("%d",&a[i]);
    }

    creat();//创建堆(其实就是对堆进行排序)

    printf("使用堆排序后:\n");
    for(i=1;i<=num;i++)//此处不要写成n了
    {
        printf("%d ",deletemax());
    }
    printf("\n");

    return 0;
}

大根堆--向上构建

#include<stdio.h>

int a[101],n;

void swap(int i,int t)
{
    int temp;

    temp = a[i];
    a[i] = a[t];
    a[t] = temp;
}

//堆排序的核心代码
void siftup(int i)
{
    int flag=0;
    while(i!=1 && flag==0)
    {
        if(a[i]>a[i/2])//比父结点大
        {
            swap(i,i/2);
        }
        else
        {
            flag = 1;
        }
                
        i = i/2;//继续向上调整
    }
}

void creat()
{
    int i;

    for(i=n;i>=1;i--)//堆排序最经典之3
    {
        siftup(i);
    }
}

void siftdown(int i)
{
    int flag=0,t;

    while(flag==0&&2*i<=n)//表示存在结点
    {
        if(a[i]<a[2*i])//比左结点小
        {
            t = 2*i;
        }
        else
        {
            t = i;
        }

        if(2*i+1<=n)//表示存在右节点
        {
            if(a[t]<a[2*i+1])//此处容易出错!是a[t]而不是a[i],自己想想为什么!最经典部分之一
            {
                t = 2*i + 1;
            }
        }

        if(t!=i)
        {
            swap(i,t);

            i = t;//这一句,我认为是堆排序最经典的部分之二。
        }
        else
        {
            flag = 1;
        }
    }
}

int deletemax()
{
    int t;

    t = a[1];
    a[1] = a[n];
    n--;        //堆排序最经典之4
    siftdown(1);

    return t;
}

int main()
{
    int i,num;

    printf("请输入堆中元素个数:");
    scanf("%d",&num);
    n = num;

    //对堆进行初始化
    printf("请输入待排序的元素:");
    for(i=1;i<=num;i++)
    {
        scanf("%d",&a[i]);
    }

    creat();//创建堆(其实就是对堆进行排序)

    printf("使用堆排序后:\n");
    for(i=1;i<=num;i++)
    {
        printf("%d ",deletemax());
    }
    printf("\n");

    return 0;
}

不要误解,其实无论向上调整还是向下调整都是可以构建大根堆或者小根堆的。
注:堆排序并不能保证完全有序,输出时需要不断调整才行!

相关文章

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 数据结构与算法之美-28讲堆和堆排序

    数据结构与算法之美-28讲堆和堆排序 特别备注 本系列非原创,文章原文摘自极客时间-数据结构算法之美[https:...

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 2018-06-30

    排序算法之堆排序 堆排序是利用堆的数据结构而设计的一种排序算法,堆排序是一种选择排序。可以利用数组的特点快速定位制...

  • 数据结构与算法

    数据结构与算法之美 数据结构与算法之美1--如何学数据结构与算法之美2--复杂度分析(上)数据结构与算法之美3--...

  • 堆排序

    hello,你好,欢迎来到堆排序!堆排序是典型的数据结构和算法的结合,首先使用数据结构记录了必要的信息,然后算法通...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

  • python实现堆排序(HeapSort)

    python实现【堆排序】(HeapSort) 算法原理及介绍 堆排序(Heapsort)是指利用堆这种数据结构所...

  • 3.11 堆的概念及堆排序思路

    Chapter3: 更好的查找与排序算法 11. 堆的概念及堆排序 [1] 图解排序算法(三)之堆排序 讲得很好,...

网友评论

      本文标题:数据结构与算法之堆排序

      本文链接:https://www.haomeiwen.com/subject/knjghftx.html